3 minute read

목표

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

학습할 것 (필수)

클래스 정의하는 방법

클래스는 클래스의 속성에 해당하는 멤버 변수 부분과 클래스의 기능에 해당하는 생성자와 메소드 정의 부분으로 구성된다.

클래스 구성

  • 멤버변수
  • 생성자
  • 메소드

한정자를 사용한 클래스 선언 구조

  • 클래스 선언

      // 클래스 한정자
      // public: 모든 클래스에서 접근 가능(클래스로부터 객체 생성 가능)
      // final: 서브 클래스를 가질 수 없음, 새로은 클래스가 상속되어 생성될 수 없음
      // abstract: 추상 클래스, 객체를 생성할 수 없음
      // 한정자 사용 안함: 같은 패키지 내의 클래스에서만 접근 가능
      [한정자][public/final/abstract] class 클래스명 {
          ...
          클래스 속성과 기능을 기술
          ...
      }
    
  • 속성만 가지는 클래스

      class Box {
          int width;
          int height;
          int depth;
      }
    
  • 속성과 메소드를 가지는 클래스

      class Box {
          int width;
          int height;
          int depth;
          public int volume(){
              int volume = width * height * depth;
              return volume;
          }
      }
    
  • 속성, 생성자, 메소드를 가지는 클래스

      class Box {
          int width;
          int height;
          int depth;
          public void Box(int w, int h, int d){
              width = w;
              height = h;
              depth = d;
          }
          public int volume(){
              int volume = width * height * depth;
              return volume;
          }
      }
    

객체 만드는 방법 (new 키워드 이해하기)

객체 생성 키워드 new를 이용해 객체를 만들 수 있다.

  • 객체 선언

      // 클래스명 객체 변수;
      String name;
    
  • 객체 생성

      // 객체 변수 = new 클래스명();
      name = new String();
    
  • 객체 선언과 생성

      // 클래스명 객체 변수 = new 클래스명();
      String name = new String();
    

객체를 선언한다는 의미는 객체 변수를 생성한다는 의미이고, 그 객체 변수의 값은 null 값이 된다. 실제 객체는 생성 연산자 new 를 사용하여 생성시켜야 한다. 객체가 생성되면 기억장소에 객체의 요소를 저장할 공간이 배정된다.

메소드 정의하는 방법

클래스의 기능에 해당하는 메소드는 객체가 할 수 있는 행동을 정의한 것이다. 메소드에 들어갈 로직(메소드 본체), 실행하는 데이터(매개변수들)가 무엇인지, 로직에 결과가 어떤 타입의 데이터(return)인지를 정의한다.

  • 메소드

      // 접근 한정자
      // static: 클래스 메소드
      // final: 종단 메소드, 서브 클래스에서 오버라이딩(overriding) 될 수 없음
      // abstract: 추상 메소드, 추상 클래스 내에서 선언될 수 있음. 선언 부분만 가지고 구현 부분은 가질 수 없다. 구현 부분은 서브 클래스에서 오버라이딩 된다.
      // synchronized: 스레드의 동기화를 위한 메소드
      [접근 한정자][static/final/abstract/synchronized] 반환값타입 메소드이름([매개변수들])
      {
          지역변수 선언  메소드 선언
      }
    
  • 클래스 메소드
    static을 사용하여 클래스 메소드를 사용할 수 있다. 클래스로부터 생성된 모든 객체들이 공유할 수 있는 메소드이다. 이러한 클래스 메소드에는 일반 객체 변수를 사용할 수 없다. 클래스 메소드내에서는 오직 클래스 변수만이 사용 가능하다.

메소드 선언부에는 그 메소드의 반환 값의 자료형이 지정되어야 한다. 없을 경우에는 void로 지정한다. void형이 아닌 메소드는 반드시 지정된 형과 같은 값을 return문을 사용하여 반환해야 한다. 메소드 오버로딩(overloading) 될 수 있다. 같은 클래스에 같은 이름의 메소드를 중첩하여 사용할 수 있다.

생성자 정의하는 방법

생성자는 객체가 생성될 때 객체의 초기화 과정을 기술하는 특수한 메소드이며 객체가 생성될 때 무조건 실행 된다. 객체를 생성하는 new 명령어(예약어)에 의해 자동으로 실행된다.

  • 생성자

      // private: 해당 클래스의 인스턴스 생성이 무의미함 
      // ex) java.util.Arrays, java.lang.Math
      [public/private] 클래스이름(매개변수){
          초기화 문장들
      }
    
      // Effective Java 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 참고
      public class Arrays {
          // Suppresses default constructor, ensuring non-instantiability.
          private Arrays() {}
          ...
      }
    	
      public final class Math {
          /**
           * Don't let anyone instantiate this class.
           */
          private Math() {}
          ...
      }
    

클래스는 여러 개의 생성자를 가질 수 있다. 같은 이름의 생성자를 여러개 overloading하여 사용할 수 있다. 생성자의 이름은 같지만, 매개변수의 타입과 개수는 반드시 달라야 하며, 리턴타입이 없다. (생성자와 메소드를 구분하는 기준)

this 키워드 이해하기

this는 현재의 객체를 의미한다. 생성자나 메소드의 매개변수가 객체 변수와 같은 이름을 사용하는 경우에 this를 사용한다. 생성자나 메소드의 매개변수 이름이 객체 변수의 이름과 같지 않을 경우에는 this를 사용하지 않아도 된다. 그러나 this의 사용은 객체 변수나 생성자, 메소드의 매개변수 이름을 의미적으로 명확하게 사용할 수 있게 해준다. this 예약어는 같은 클래스 내의 다른 생성자의 메소드를 호출하는 경우에도 사용할 수 있다.

  • this

      class Box {
          int width;
          int height;
          int depth;
          String color;
    
          Box(int width, int height, int depth){
              this.width = width;     // this.width: Box 클래스의 멤버 변수, width: Box 함수의 파라미터
              this.height = height;
              this.depth = depth;
          }
          Box(int width, int height, int depth, String color){
              this(width, height, depth); // Box 클래스의 생성자
              this.color = color;
          }
      }
    

과제 (Optional)

int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.

int value, Node left, right를 가지고 있어야 합니다.

BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.

DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.


live-study with whiteship