목표

자바의 Class에 대해 학습하세요.

학습할 것 (필수)

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

과제 (Optional)

  • int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.
  • int value, Node left, right를 가지고 있어야 합니다.
  • BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.
  • DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.

공부 내용

1. 클래스 정의하는 방법
클래스는 자바에서 객체를 표현할 수 있는 문법을 말한다.
모든 현상을 하나의 객체로 바라보면 그 객체는 속성과 행동으로 구분할 수 있다.
해당 속성 + 행동을 하나의 타입으로 묶은 것을 클래스라고 한다. (클래스 = 변수 + 메소드)

그럼 클래스만 있으면 끝일까? 아니다! 클래스는 말그대로 객체를 표현할 수 있는 일종의 설계서(?)라고 볼 수 있다.
예시를 들어보면 아래와 같이 생각을 해볼 수 있을것 같다.

이미지 출처: https://yeobhoh126.tistory.com/entry/%EB%B6%95%EC%96%B4%EB%B9%B5%ED%8B%80-%EB%AF%B8%EB%8B%88-%EB%B6%95%EC%96%B4%EB%B9%B5%EA%B8%B0%EA%B3%84%EF%BC%A0

겨울철이면 붕어빵이 가장 생각나는데 붕어빵의 원리를 클래스에 대입해 보려 한다.

붕어빵이 나오기 위해서는 모양을 고정하는 틀과 반죽이 있어야 하는데 이 붕어빵 틀이 일종의 클래스라고 매칭시켜서 볼 수 있다.
그럼 붕어빵은? 클래스가 인스턴스로 실제 실행가능한 객체를 이와 유사하게 생각해 볼 수 있다.

딱 맞아 떨어지지는 않지만 저는 이와 같이 이해(?) 합니다~

 

이제 코드로 클래스를 정의해 보자.

public class Animal {

}
  • 동물을 클래스로 정의한다고 했을 때 위와 같이 정의할 수 있다.
  • public: 클래스의 유효 범위를 정할 수 있다.접근 제어자라고 한다.
    • public: 모든 패키지에서 해당 클래스로 접근가능
    • protected: 상속받은 클래스에서 접근가능
    • private: 자신을 포한한 패키지에서만 해당 클래스로 접근 가능
  • class: 클래스를 만들때 사용하는 문법 지시자이다. 
  • Animal: 클래스 이름, 첫 글자는 대문자로 쓰는 것이 관례이다.
    그 외에 클래스 이름이 길어질 때는 camel 표기법(CamelCamel 과 같은 방식) 을 사용할 수도 있고 다른 표기법을 쓸 수 도 있지만 기본적으로는 camel 표기법을 사용한다.

2. 객체 만드는 방법 (new 키워드에 대한 이해)

1번에서 적용한 내용은 클래스의 선언만 한 것이지 실제로 적용할 수 있는 인스턴스를 생성한 것이 아니다.
인스턴스는 아래와 같이 생성할 수 있다.

class Animal {

}

public class Test {
    public static void main(String[] args) {
        Animal hi = new Animal();
    }
}

 

메모리 관점으로 접근해 보면 객체의 데이터는 힙 영역에 저장되고 스택 영역에 해당 값을 참조할 수 있는 주소 정보가 담긴다.

Stack에 주소값이 들어간다.

 

3. 메소드 정의하는 방법

위의 Animal 클래스는 선언만 했지 속성과 메소드가 없다. 
속성과 메소드는 아래와 같이 정의할 수 있다.

class Animal {
    private int age;

    protected void bark() {
        System.out.println("짖습니다.");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal dog = new Animal();
        dog.bark();
    }
}

자 기존 Animal 클래스에 age라는 속성을 추가하고  bark라는 메소드를 정의했다.
메소드를 정의하면 main 메소드에서 dog라는 변수에 새로운 Animal 객체를 생성하고 위에서 생성한 bark 라는 메소드를 호출한다.

음 그런데 외부에서 age라는 동물의 나이속성을 입력하고 싶은데 어떻게 해야할까?
그럴때 사용할 수 있는 방법이 있는데(Setter 메소드, 생성자) 생성자를 알아보자.

4. 생성자 정의하는 방법

생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드이다.
생성자는 
인스턴스 속성값을 초기화 시키는 역할을 한다. 

class Animal {
    int age;

    // 생성자
    public Animal(int age) {
        this.age = age;
    }

    protected void bark() {
        System.out.println("짖습니다.");
    }

    protected int getAge() {
        return this.age;
    }

}

public class Test {
    public static void main(String[] args) {
        Animal dog = new Animal(1);

        System.out.println(dog.getAge());
    }
}

위 코드를 보면 아래와 같이 생성자가 구성되었다.

    // 생성자
    public Animal(int age) {
        this.age = age;
    }

public 클래스명(인자) 로 생성자를 만들 수 있는데 new 연산자로 생성시 입력한 인자를 받아 인스턴스의 속성에 대입하는 과정(초기화)을 거치게 된다.

음... 그런데 클래스가 생성될 때 반드시 생성자가 호출되어야 하는데 기존에 생성자를 만들지 않았는데도 클래스가 인스턴스화 되었다.
그 이유는 디폴트 생성자 를 자동으로 생성해 주기 때문이다.

class Animal {
    int age;

    // 아무것도 하지 않아도 아래와 같은 디폴트 생성자가 만들어진다~
    public Animal() {
    }
}

 

5. this 키워드 이해하기

자 2번째 질문을 해보자. 위의 생성자에서 this.age = age 라는 구문이 있는데 여기서 this라는 키워드는 무엇을 나타내는 걸까?
아래 그림으로 생각해보자.

 

참고

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

  • 책: 난 정말 JAVA를 공부한적이 없다구요. (윤인성 지음)

+ Recent posts