티스토리 뷰

728x90

클래스를 정의하는 방법

자바에서 클래스는 객체의 정보를 담고있는 하나의 그릇이다. 클래스에는 변수와 생성자, 메서드(함수)를 포함할 수 있다.
클래스를 정의하는 방법

public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

Person 클래스에는 이름과 나이의 멤버변수(필드변수)를 갖고 접근자는 private으로 선언되어있다. 객체지향에서는 바로 상태(값)에 접근하는 방법은 지양하고 getter나 setter의 메서드를 사용해서 값을 가져오거나 수정할 수 있다.

객체 만드는 방법 (new 키워드)

클래스로 부터 객체를 만드는 과정을 인스턴스화라고 한다.
인스턴스를 생성할 때는 클래스명 변수명 = new 클래스명() 으로 생성할 수 있다.

public class PersonDemo {
    public static void main(String[] args) {

        Person person = new Person();

        person.setName("김아무개");
        person.setAge(28);

        String name = person.getName();
        int age = person.getAge();

        System.out.println("name = " + name);
        System.out.println("age = " + age);
    }
}

변수명을 person으로 하는 Person 클래스의 인스턴스를 생성해서 setter를 통해 값을 넣어준 후 getter로 값을 받아왔다.

메소드 정의하는 방법

메소드(method)는 기능이다. 객체의 상태를 변경시켜줄 때 사용하는 동작이다.
메소드의 선언은 선언부(리턴타입, 메소드이름, 매개변수선언)와 실행블록으로 구성된다.
위에 보았던 getName과 setName도 선언부와 실행블록으로 구성된 메소드이다.

    public String getName() {
        return name;
    }

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

getName은 리턴타입이 String인 메소드이고 매개변수는 없다. setName은 리턴타입이 void이고 매개변수는 String타입의 변수를 하나 받는다.
메소드를 정의할때는 자바에서는 암묵적인 규칙으로 첫번째 글자가 소문자로오고 camelCase로 작성한다.
camelCase란 프로그래밍에서 파일, 변수, 함수 등 대상의 이름을 띄어쓰기 없이 짓기 위하여 따르는 관례인 네이밍컨벤션의 하나다.

생성자 정의하는 방법

생성자도 메소드이다. 위의 Person의 인스턴스를 생성할 때 new 다음에 나오는 클래스()가 생성이다.
생성자는 new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
모든 클래스는 기본생성자를 반드시 포함하고 있다. 클래스 내부에 기본생성자를 생략했으면 컴파일러가 기본생성자를 자동으로 바이트코드에 추가시킨다.

[public] 클래스() {}

실제로 위의 Person클래스를 class파일로 만들어서 바이트코드로 확인해보았다.

public class week05.Person {
  public week05.Person();        //생성자 추가
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public java.lang.String getName();
    Code:
       0: aload_0
       1: getfield      #2                  // Field name:Ljava/lang/String;
       4: areturn

  public void setName(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #2                  // Field name:Ljava/lang/String;
       5: return

  public int getAge();
    Code:
       0: aload_0
       1: getfield      #3                  // Field age:I
       4: ireturn

  public void setAge(int);
    Code:
       0: aload_0
       1: iload_1
       2: putfield      #3                  // Field age:I
       5: return
}

기본생성자는 자동으로 생성되지만 만약 매개변수 값을 가지는, (객체를 초기화 할때 상태 값을 초기화해주는 값) 생성자를 만들었다면 컴파일러가 기본생성자를 자동으로 추가해주지 않는다.

this 키워드 이해하기

this키워드는 인스턴스 자신을 가리킨다.
this 키워드를 사용하는 가장 일반적인 이유는 필드가 메서드 또는 생성자 매개 변수와 구분하기 위해서 사용된다.

public class Point {
    public int x = 0;
    public int y = 0;

    //constructor
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}

위처럼 매개변수의 변수명과 필드의 변수명이 다르면 상관없지만 보통 자바에서는 같게주는데 이럴때 인스턴스의 필드임을 나타내기위해 this키워드를 사용한다.

public class Point {
    public int x = 0;
    public int y = 0;

    //constructor
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

생성자에서 다른 생성자를 호출할 때는 this()를 사용할 수 있다. (이를 명시적 생성자 호출이라고 한다.)
단 다음의 두 조건을 만족시켜야 한다.

  • 생성자의 이름으로 클래스이름 대신 this를 사용한다.

  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

public class Rectangle {
    private int x, y;
    private int width, height;
        
    public Rectangle() {
        this(0, 0, 1, 1);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    ...
}

위 Rectangle 클래스는 여러 생성자를 포함하고 있다. 첫 번째 기본생성자에서는 인수가 4개인 생성자를 호출하고 있고 인수가 2개인 생성자는 width와 height를 가지고 인수가 4개인 생성자를 호출하고 있다. 컴파일러는 인수의 수와 유형에 따라서 호출할 생성자를 결정한다.
쉽게 말해서 this는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼, this로 인스턴스 변수에 접근할 수 있다.

 

그런데 this를 사용할 수 있는 것은 인스턴스 멤버 뿐이다. 어찌보면 당연한 이야기다. 인스턴스란 객체를 new 로 생성한 것을 인스턴스라고 하는데 이 인스턴스를 생성하지 않고는 this를 사용할 수 없다.

선택(Optional)

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

참고

https://docs.oracle.com/javase/tutorial/

 

The Java™ Tutorials

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

http://www.yes24.com/Product/Goods/24259565?OzSrank=2

 

Java의 정석

최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 `자바의 정석`의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을 잘 파악하고 쓴 책. 뿐만 아

www.yes24.com

 

www.yes24.com/Product/Goods/15651484?OzSrank=2

 

이것이 자바다

15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서. 저자 직강의 인터넷 강의와 Q/A를 위한 커뮤니티(네이커 카페)까지 무료로 제공하여 자바 개발자로 가

www.yes24.com

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함