ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 자바 클래스 와 객체 및 키워드
    Java/Java 기본 및 이론 2021. 1. 17. 20:05
    • 클래스 정의하는 방법
    • 객체 만드는 방법 (new 키워드 이해하기)
    • 메소드 정의하는 방법
    • 생성자 정의하는 방법
    • this 키워드 이해하기

    클래스란

    클래스는 쉽게 설명하면 객체를 만들기 위한 틀

    붕어빵은 하나의 객체로 이를 만들기 위한 붕어빵틀은 하나의 클래스로 설명할 수 있다.

    이런 클래스는 class라는 키워드로 정의되며 각각 변수(속성)와 메서드(행위)를 가지게 된다.

     

     

    클래스 요소

    • 필드(field) - 필드는 해당 클래스 객체의 상태 속성을 나타내며, 멤버 변수라고도 불린다. 여기서 초기화하는 것을 필드 초기화 또는 명시적 초기화라고 한다.

      • 인스턴스 변수 - 이름에서 알 수 있듯이 인스턴스가 갖는 변수이다. 그렇기에 인스턴스를 생성할 때 만들어진다. 서로 독립적인 값을 갖으므로 heap 영역에 할당되고 gc에 의해 관리된다.
      • 클래스 변수 - 정적을 의미하는 static키워드가 인스턴스 변수 앞에 붙으면 클래스 변수이다. 해당 클래스에서 파생된 모든 인스턴스는 이 변수를 공유한다. 그렇기 때문에 heap 영역이 아닌 static 영역에 할당되고 gc의 관리를 받지 않는다. 또한 public 키워드까지 앞에 붙이면 전역 변수라 볼 수 있다.
    • 메서드(method) - 메서드는 해당 객체의 행동을 나타내며, 보통 필드의 값을 조정하는데 쓰인다.

      • 인스턴스 메서드 - 인스턴스 변수와 연관된 작업을 하는 메서드이다. 인스턴스를 통해 호출할 수 있으므로 반드시 먼저 인스턴스를 생성해야 한다.
      • 클래스 메서드 - 정적 메서드라고도 한다. 일반적으로 인스턴스와 관계없는 메서드를 클래스 메서드로 정의한다.
    • 생성자(constructor) - 생성자는 객체가 생성된 직후에 클래스의 객체를 초기화하는 데 사용되는 코드 블록이다. 메서드와 달리 리턴 타입이 없으며, 클래스엔 최소 한 개 이상의 생성자가 존재한다.
    • 초기화 블록(initializer) - 초기화 블록 내에서는 조건문, 반복문 등을 사용해 명시적 초기화에선 불가능한 초기화를 수행할 수 있다.

      • 클래스 초기화 블록 - 클래스 변수 초기화에 쓰인다.
      • 인스턴스 초기화 블록 - 인스턴스 변수 초기화에 쓰인다.

        클래스 변수 초기화: 기본값 → 명시적 초기화 → 클래스 초기화 블록
        인스턴스 변수 초기화: 기본값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자

    클래스 정의

    class Class {               // 클래스
        String constructor;
        String instanceVar;     // 인스턴스 변수
        static String classVar; // 클래스 변수
    
        static {                // 클래스 초기화 블록
            classVar = "Class Variable";
        }
    
        {                       // 인스턴스 초기화 블록
            instanceVar = "Instance Variable";
        }
    
        Class() {                // 생성자
            constructor = "Constructor";
        }
    
        void instanceMethod() {       // 인스턴스 메서드
            System.out.println(instanceVar);
        }
    
        static void classMethod() {   // 클래스 메서드
            System.out.println(classVar);
        }
    }

     

     

    제어자 키워드

    접근 제어자 - public, protected, default, private
    그 외 - static, final, abstract, transient, synchronized, volatile etc.

    • 접근 제어자 - 접근 제어자는 해당 클래스 또는 멤버를 정해진 범위에서만 접근할 수 있도록 통제하는 역할을 한다. 클래스는 public과 default밖에 쓸 수 없다. 범위는 다음과 같다. 참고로 default는 아무것도 덧붙이지 않았을 때를 의미한다.

    • static - 변수, 메서드는 객체가 아닌 클래스에 속한다.
    • final

      • 클래스 앞에 붙으면 해당 클래스는 상속될 수 없다.
      • 변수 또는 메서드 앞에 붙으면 수정되거나 오버라이딩 될 수 없다.
    • abstract

      • 클래스 앞에 붙으면 추상 클래스가 되어 객체 생성이 불가하고, 접근을 위해선 상속받아야 한다.
      • 변수 앞에 지정할 수 없다. 메서드 앞에 붙는 경우는 오직 추상 클래스 내에서의 메서드밖에 없으며 해당 메서드는 선언부만 존재하고 구현부는 상속한 클래스 내 메서드에 의해 구현되어야 한다. 상속과 관련된 내용은 6주차에 다룰 예정이다.
    • transient - 변수 또는 메서드가 포함된 객체를 직렬화할 때 해당 내용은 무시된다.
    • synchronized - 메서드는 한 번에 하나의 쓰레드에 의해서만 접근 가능하다.
    • volatile - 해당 변수의 조작에 CPU 캐시가 쓰이지 않고 항상 메인 메모리로부터 읽힌다.

    객체 생성

    public class Person {
        private int age = 10;
        private String name = "jun";
    
        Person() {}  // 기본 생성자
    
        Person(int age, String name) {
            setAge(age);
            setName(name);
        }
    
        public int getAge() {
            return age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    public static void main(String[] args) {
    	Person p1 = new Person();
    	Person p2 = new Person(15, "min");
    }

    new 연산자

    new연산자는 클래스 타입의 인스턴스를 생성해주는 역할을 하는 연산자로 메모리(Heap 영역)에 공간을 할당받고 그 공간의 참조값을 객체에게 반환해주는 역할을 한다.

    new 키워드는 새 객체에 메모리를 할당하고 해당 메모리에 대한 참조값을 반환하여 클래스를 인스턴스화한다. 

    일반적으로 객체가 메모리에 할당되면 인스턴스라 부른다

     

    생성자 정의

    Person() {}  // 기본 생성자
    
    Person(int age, String name) {
        setAge(age);
        setName(name);
    }

     생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 생성한다.

    하지만 기본 생성자가 아닌 다른 형태의 생성자만 생성했다면 기본 생성자는 생성되지 않는다.

     

    this 키워드

    public void setAge(int age) {
        this.age = age;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    this키워드는 인스턴스 자신을 가르킨다. 위 코드에서 this를 사용함으로써 지역변수 age, name와 구분할 수 있다. 당연한 말이지만 클래스 (static)메서드에서는 this를 쓸 수 없다. 왜냐하면 인스턴스가 생성되지 않았을 수도 있기 때문이다.

     

    this()는 해당 클래스 생성자를 호출할 수 있다. 그렇기 때문에 생성자를 재사용하는 데 쓰인다. (생성자 체이닝)

     

    public class Person {
        int age;
        String name;
        int height;
    
        Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        Person(int age, String name, int height) {
            this.age = age;
            this.name = name;
            this.height = height;
        }
    }

     

    super 키워드

    super의 경우 this와는 다르게 자식클래스가 부모클래스로부터 상속받은 멤버로를 사용하고자 할때 사용된다.

    class Parent{
       int a = 10;
    }
    
    class Child extends Parent{
        int a = 20;
        
        void childMethod(){
               System.out.println(a);         //20
               System.out.println(this.a);     //20
               System.out.println(super.a);   //10
        }
    }
    

    super 키워드와 this 키워드의 기능이 비슷하 듯이 this()와 super() 키워드 역시도 기능이 비슷하다. super() 키워드는 this()와 마찬가지로 생성자를 호출하는 함수로, 자기자신이 아닌 부모클래스의 생성자를 호출한다.

     

    반응형

    댓글

Designed by Tistory.