728x90

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


# 학습할 것

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

 

클래스를 정의하는 방법


클래스를 정의하는 방법은 다음과 같이 자바에 class 라는 키워드를 사용하는 것이다.

package me.xxxelppa.study.week05;
 
public class Exam_001 {
    
}

위 예제는 Exam_001 이라는 이름의 클래스를 정의한 것을 보여준다.

 

클래스를 정의하는 것 자체는 별로 어렵지 않다고 생각한다.

문제는 잘 만드는 것이다.

 

자바 공부를 중간에 포기한 사람도 자바는 객체지향 언어라는 것은 들어봤을 것이다.

여기서 말하는 이 객체를 자바에서는 클래스를 통해 만들어 진다.

다시 말해서 객체를 만들기 위해 클래스를 정의한다고 생각하면 된다.

 

간혹 이것 때문에 객체와 클래스를 동일한 것으로 착각 하기도 한다.

그래서 보통의 기본서에서 이 둘의 관계를 붕어빵과 붕어빵 틀이라고 설명하고 있다.

붕어빵 틀이 클래스, 붕어빵이 객체.

틀린 말은 아니라고 생각하지만 처음엔 무슨 말인지 잘 이해하지 못했었다.

(심지어 객체가 뭐냐고 물어봤을 때 '붕어빵이요' 라는 대답을 들은 적도 있다.)

 

개인적으로 클래스는 실체를 상상할 수 있는 추상화된 설계서라고 하고 싶다.

예를 들어 '자동차' 설계 도면을 보면 바퀴가 있고 앞으로도 가고 뒤로도 가는 탈 것을 떠올릴 수 있다.

그리고 실제 도로에 보이는 저 자동차 하나하나는 '자동차' 라고 하는 추상적인 것을 실물로 만들어낸 객체이다.

(클래스를 통해 만들어진 객체가 어떤 속성을 가지며 어떤 동작을 할 수 있는지 설계해 놓은 것이 클래스이다.)

 

사람은 클래스이고 객체가 아니다.

하지만 철수는 사람이지만 객체이지 클래스가 아니다.

 

컴퓨터는 클래스이고 객체가 아니다.

하지만 지금 내 눈 앞에 존재하는 이 컴퓨터는 컴퓨터라고 부르지만 클래스가 아니고 객체이다.

 

그렇기 때문에 클래스는 그 자체로는 사용할 수 없다.

즉, 클래스를 통해 객체화 되어야 실제로 사용할 수 있다.

 

 

그렇기 때문에 클래스의 이름을 지을 때는 특히 조심해야 한다.

몇 가지 네이밍 컨벤션이 존재한다.

명사여야 한다던가 영문 대문자로 시작하도록 하는 것들이 그렇다. (메소드는 영문 소문자로 작성 하도록 권장한다.)

꼭 지켜야 프로그램이 동작하는 것은 아니지만, 이름을 보고 무엇인지 유추할 수 있도록 이름을 짓는 것이 여러가지로 정신 건강에 이롭다.

 

 

바로 이 클래스는 크게 두 가지를 담고 있다. 속성과 행위이다.

앞서 자동차 얘기를 했으니 자동차 클래스를 만든다고 생각 해보자.

자동차가 가질 수 있는 속성으로는 제조사, 색상, 연비, 시트 재질, 최대 탑승 입원, 종류 등이 있다.

행위로는 앞으로 가기, 뒤로 가기, 옆으로 가기, 방향 지시등 켜기, 에어컨 켜기, 에어컨 끄기 등이 있다.

 

정의하기 나름이지만 일반적으로 위와 같이 속성과 행위(또는 기능이라고 하기도 한다)를 가지고 있다.

일반적으로 속성을 다른 말로 멤버 필드 라고도 하며, 행위는 메소드 라고 부른다.

 

 

클래스에 대해 간단히 정리하면

1. 클래스 자체로는 아무것도 할 수 없다. (리플렉션 같은 특수한 경우 제외)

2. 객체화 해야 비로소 사용할 수 있다.

3. 오류가 발생하지 않지만, 네이밍 컨벤션을 되도록 지켜줘야 한다.

4. 클래스는 속성과 행위 내용을 담을 수 있다. (꼭 담아야 하는 것은 아니다.)

 

정도가 될 수 있을 것 같다.

 

마지막으로 하나의 java 파일 안에 다수의 클래스를 정의할 수 있다.

하지만 public 키워드가 붙은 class 는 단 하나만 존재해야 하며, 이 클래스는 파일 이름과 완벽하게 동일한 이름을 가져야 한다.

되도록 하나의 파일에는 하나의 클래스만 정의하는게 일반적이다. (중첩 클래스 제외)

 

** 클래스 내에 클래스를 선언하는 중첩 클래스도 있는데, 우선 일반적인 경우만 간략하게 정리 했다.

 

 

728x90

 

 

 

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


자바에서 클래스에 대한 객체 뿐만 아니라 객체를 만들 때 new 라는 키워드를 사용한다.

이 키워드를 사용하면 이 객체를 동적 메모리 할당 영역에 생성한다.

이 영역에 할당한다는 것은 GC에 의해 관리된다는 것을 의미한다.

 

현재 클래스에 대해 정리하고 있으니 클래스의 객체를 생성하는 방법에 대해 알아보려 한다.

하지만 그 전에 클래스에 대한 개인적인 이해를 하나 더 정리해두려 한다.

 

이전에 이미 자료형에 대해 정리를 했었다.

결론부터 얘기하자면 클래스도 하나의 자료형 이다.

앞서 정리한 자료형과는 자바가 기본적으로 제공을 해주느냐 아니면 사용자(여기서 사용자는 코드를 작성하는 사람)가 정의한 자료형이냐의 차이가 있다.

 

자료형에 대한 기억은 잠시 되짚어보면, int 라는 기본 정수형 자료형을 보면 우리가 기본적으로 기대하는게 있다.

정수를 담을 수 있고, 그 값의 범위는 대략 -21억 ~ +21억이며, 다른 기본 자료형에 타입 캐스팅 되었을 때의 기대값 등 어떤 형태를 가지고 어떤 동작을 할지 상상할 수 있다.

즉, int 타입의 자료형으로 선언된 변수에 담긴 값이 어떤 속성과 어떤 행위들을 할 수 있는지 우리는 int 라는 것을 보고 알 수 있다.

 

클래스와 매우 유사하다고 느껴지지 않는다면 나의 잘못이다.

 

 

다른 얘기로 돌아왔지만, 객체를 생성하는 방법은 다음과 같다.

 

// 객체화 할 임의의 클래스
class TargetClass { }
 
// TargetClass 클래스의 객체를 생성 할 클래스
public class MainClass {
    // 굳이 main 메소드 안에서 생성 할 필요는 없다.
    TargetClass tc = new TargetClass();
    int myValue = 10;
}

 

7라인에서 TargetClass 클래스 타입의 변수 tc 를 선언하고, 그 안에 new TargetClass() 를 사용하여 생성한 객체를 담고 있다.

여기서 TargetClass tc 이 부분이 일반 자료형의 변수를 선언한 것과 매우 닮아있다는 것을 눈여겨 보았으면 좋겠다.

 

8라인의 int myValue 는 int 자료형 타입의 변수 myValue 를 선언한 것이지 아직 값이 담긴것이 아니다.

할당 연산자인 등호(=) 기준 오른쪽의 값이 int 타입의 자료형에 담길 수 있는 값이기 때문에 컴파일 오류가 발생하지 않고 값을 담고 있다.

이것과 마찬가지로 TargetClass 타입의 자료형 변수 tc를 선언 하였으며,

컴파일 오류가 발생하지 않는 이유는 할당 연산자인 등호(=) 기준 오른쪽 값이

new TargetClass() 의 결과가 TargetClass 타입의 값이 될 수 있기 때문이다.

 

 

객체 생성 방법이 대해 알아보다 갑자기 또 클래스 얘기를 해버렸지만,

하고 싶은 얘기는 클래스도 결국 사용자가 정의한 하나의 자료형이라는 것이다.

 

 

마지막으로 java에는 생략할 수 있는 것들이 생각보다 많이 있다.

위 예제에서 객체를 생성함에 있어서 생략된 부분을 명시하면 다음과 같다.

 

// 객체화 할 임의의 클래스
class TargetClass {
    public TargetClass() { }    // 생략된 부분
}
 
// TargetClass 클래스의 객체를 생성 할 클래스
public class MainClass {
    // 굳이 main 메소드 안에서 생성 할 필요는 없다.
    TargetClass tc = new TargetClass();
    int myValue = 10;
}

 

3라인에 작성한 부분이 ​사용자가 작성하지 않아도 이미 작성한 것 처럼​ 동작하는 생략된 코드이다.

기본 생성자 라고 부르며 자신이 속한 클래스 이름과 완벽히 똑같은 이름을 가지며 매개변수가 아무것도 없는 것이 특징이다.

 

여기서 눈여겨 볼 것은 9라인에서 new TargetClass() 문장에서 ​매개변수가 없다는 것​과 3라인의 기본 생성자의 ​매개변수 또한 없다는 것​이다.

객체를 생성하려면 해당 클래스의 생성자와 매개변수를 일치시켜야 한다. (매개변수의 타입까지)

 

만약 그렇지 않다면 객체는 생성되지 않는다.

 

예를 들면 다음과 같이 작성하면 TargetClass의 객체는 생성할 수 없다.

 

// 객체화 할 임의의 클래스
class TargetClass {
    // private 접근 제한자로 외부에서 생성자에 접근할 수 없도록 제한한다.
    private TargetClass() { }
}
 
// TargetClass 클래스의 객체를 생성 할 클래스
public class MainClass {
    // 굳이 main 메소드 안에서 생성 할 필요는 없다.
    // 동일한 매개변수를 받는 생성자에 접근할 수 없으므로 컴파일 오류가 발생한다.
    TargetClass tc = new TargetClass();
    int myValue = 10;
}

 

실제로 작성 해보면 'TargetClass()' has private access 라는 메시지를 보여줄 것이다.

여기서 TargetClass 클래스가 아니고 TargetClass() 이 생성자가 private 접근만 허용하기 때문이다.

 

생성자에 대한 자세한 내용은 잠시 뒤에 정리 해보려 한다.

 

 

 

메소드 정의하는 방법


메소드는 클래스 내부에 정의할 수 있으며, 클래스와 마찬가지고 네이밍 컨벤션을 가지고 있다.

일반적으로 동사 형태를 사용하고, 영문 소문자로 시작하도록 권장한다.

 

C언어를 먼저 공부한 사람들이 보통 메소드와 함수라는 용어를 혼용해서 사용하는데, 메소드는 독립적으로 존재할 수 없기 때문에 되도록 구분해야 한다고 생각한다.

 

 

자바에는 생략 가능한 키워드들이 많다.

예를 들면 import 가 그렇다.

 

갑자기 다른 소리를 하게 되었는데, 자바에는 굉장히 많은 클래스가 존재한다.

그렇기 때문에 중복되는 경우도 많다.

쉽게 설명하면 동명이인이라고 생각하면 될 것 같다.

 

그럼 어쨌든 동명이인을 구분 할 필요가 있는데, 자바에서는 패키지라는 것으로 구분한다.

패키지는 폴더라고 생각하면 된다.

같은 폴더 내에는 같은 이름의 파일을 저장할 수 없다. (확장자가 다른 경우는 생각하지 않는다.)

같은 이름의 파일을 저장하는 방법은, 이름을 바꾸는 방법도 있지만 (예를 들어 버전을 명시 한다던가)

폴더를 하나 더 만들어서 저장하면 된다.

 

아무튼

자바를 처음 시작할 때 Hello World 를 출력한 기억이 있을 것이다.

그 때 아무런 의심 없이 다음과 같은 코드를 작성 했을 것이다.

 

public class MyFirstJava {
    public static void main(String[] ar) {
        System.out.println("Hello World");
    }
}

 

다른 것들도 그렇지만 System.out.println 이라는 것은 어디서 왔을까?

생긴걸 보면 소괄호를 사용하고, 문자열을 전달하는 것을 봐서 메소드 같긴 한데...

나는 그 어디에도 System 이나 out 또는 println 에 대해 그 무엇도 하지 않았는데

컴파일도 잘 되고 심지어 실행도 잘 된다.

 

자바 api 문서에서 찾아보면 System 이라는 것은 (영문 대문자로 시작했기 때문에 클래스 라고 유추할 수 있다.)

lang 이라는 패키지 안에 정의 되어 있다고 나온다.

 

 

즉, 다시 말해서 우리는 lang 이라는 패키지(폴더)안에 있는 System 이라는 클래스를 가져다 사용한 것이다.

그런데 작성한 코드 어디를 봐도 관련된 내용을 찾아볼 수 없다.

자바에서는 따로 작성하지 않아도 import java.lang.*; 라는 문장을 있는 것처럼 취급한다.

그래서 따로 정의하지 않고도 사용할 수 있었던 것이다.

 

 

생략 가능한 키워드에 대해 얘기 하다 주제에서 많이 벗어났는데, 메소드 정의에도 생략할 수 있는 것이 있다.

우선 가장 기본적인 형태의 메소드는 다음과 같이 정의 할 수 있다.

 

[접근 제한자] [반환 자료형] [메소드 이름] ( [매개변수] ) {

    // 실행 블록

}

 

이것들 외에도 메소드 정의시 작성할 수 있는 것들이 더 많지만, 기본적인 것들에 대해서만 우선 정리해본다.

 

[1. 접근제한자]

  말 그래도 접근을 제한하는 키워드이다.

그 종류로는 public, protected, private 등이 있다.

간혹 default 또는 package 라고 하는 같은 패키지 내에서만 접근이 가능한 접근 제한자가 있다고 하지만, 키워드가 따로 존재하지 않고, 아무것도 작성하지 않으면 이 접근 레벨을 갖는다.

 

public 은 모든 접근을 허용하고, protected 는 같은 패키지에 속하거나 상속 관계에서 접근할 수 있도록 한다.

마지막으로 private은 선언된 클래스 내에서만 접근이 가능하다.

 

 

여기서 한 가지 설명할 것이 있다. 바로 객체지향의 특징중에 캡슐화와 은닉화이다.

캡슐화와 은닉화를 같은 것으로 취급하는 것을 많이 봤지만, 개인적으로 이것을 구분해서 이해했으면 하는 바람이다.

캡슐화 (encapsulation) 자체가 소중히 보호 한다는 의미도 있지만, 일반적으로 관련이 깊은 속성과 기능을 하나의 클래스로 묶는다는 의미가 강하다.

예를 들어 자동차 클래스를 정의 하는데, 그 안에 '보조석에서 과자를 먹는다' 같은 기능을 넣지 않는 것 처럼

자동차 클래스는 자동차 자체에 대해서만 깊은 연관이 있어야 한다.

 

은닉화(information hiding)는 속성을 외부에 노출시키지 않음을 의미한다.

예를 들어 자동차 색상을 red 에서 green 으로 바꾸고 싶다고 하자.

 

class Car {
    public String color = "red";
    
    public setColor(String newColor) {
        System.out.println("자동차 색상을 변경합니다.");
        System.out.println("비용이 입금 되었는지 확인 합니다.");
        System.out.println("페인트를 준비 합니다.");
        color = newColor;
        System.out.println("색상 변경이 완료 되었습니다.);
    }
}

 

현실과 많이 다르겠지만, 색상을 바꾸기 전과 후에 부가적인 작업이 필요하다고 하자.

이 작업들을 온전히 수행하려면 ​자동차 클래스를 설계한 사람의 의도대로​ 동작할 수 있도록 setColor() 메소드를 통해서만 변경 작업이 이루어 져야 한다.

즉, ​속성에 직접 접근해서 색상을 바꿔버리면​ 자동차 클래스를 설계한 사람의 의도와 다른 결과가 발생할 수 있다.

 

이러한 문제를 미리 방지하기 위해 ​일반적으로 속성은 private 으로, 메소드는 public 으로 선언​한다.

 

 

[2. 반환 자료형]

  이곳에는 사용자 정의 자료형을 포함하여 기본자료형, 인터페이스 등 모든 종류의 자료형을 기입할 수 있다.

그리고 사용자는 이 메소드를 호출해서 실행한 결과 값이 반환 자료형의 타입의 값임을 알 수 있다.

즉, 메소드 안에서 무슨 일이 일어나는지 모르겠지만 (또 상관도 없고) 내가 그 메소드 호출하면 그 타입의 값이나 주쇼! 라고 생각하면 된다.

 

 

[3. 메소드 이름]

  메소드 이름에 대해서는 본 주제의 맨 처음에도 언급 헀지만, 네이밍 컨벤션이 있으므로 되도록 권고를 따라 작성하면 된다.

변수 이름을 포함하여 클래스, 메소드의 이름을 잘 짓는것은 가독성을 포함하여 유지보수 할 때 매우 중요하니 모호하지 않도록 잘 작성하는 것이 중요하다.

 

 

[4. 매개변수]

  해당 메소드를 호출할 때 필요한 값들을 전달 받을 수 있다. 하지만 그렇다고 꼭 사용해야 하는 것은 아니지만, 되도록이면 필요한 값들만 전달 받을 수 있도록 하는것이 좋다.

 

 

위에 정리한 내용을 바탕으로, 두 개의 정수를 입력 받아 합을 반환하는 메소드를 다음과 같이 정의할 수 있다.

 

public int add(int n1, int n2) {
    return n1 + n2;
}

 

메소드는 알겠는데 이 코드에 처음보는 키워드가 있다.

return 이라는 키워드 이다.

이 return 이라는 키워드는 메소드의 실행 결과를 반환하는 기능을 한다.

 

그렇기 때문에 이 return 키워드 우측에는 '값'이 와야 하며, 이 값은 반환 자료형 타입의 값이어야 한다.

이 키워드를 만나면 언제든 이 메소드를 종료 해버린다.

 

 

 

생성자 정의하는 방법


생성자를 정의 하는 방법은 간단하다.

클래스 이름과 완전히 동일한 메소드를 선언하면 되는데, 일반 메소드와 다른 점은 반환 자료형을 명시하지 않는 다는 것이다.

 

class MyClass {
    // 기본 생성자 :: 작성하지 않아도 있는 것으로 간주
    public MyClass() { }
}

 

이 생성자는 여러개를 중복해서 선언할 수 있다.

대신 매개변수의 타입이나 개수가 달라 서로 식별이 가능해야 한다.

이것을 생성자 오버로딩이라고 한다.

 

class MyClass {
    // 기본 생성자 :: 작성하지 않아도 있는 것으로 간주
    public MyClass() { }
 
    public MyClass(int number) { }
 
    public MyClass(String str) { }
 
    public MyClass(int number, String str) { }
}

 

일반 메소드에서 그랬듯 매개변수로 받지만 굳이 사용하지 않아도 오류가 발생하지는 않는다.

하지만 일반적으로 생성자는 객체를 생성할 때 사용하기 때문에 보통 속성 값을 할당 (클래스 멤버 필드 라고도 한다) 할 값을 전달 받을 때 사용한다.

일반적인 사용 방법은 다음과 같다.

 

class MyClass {
    private int age;
    private String name;
 
    public MyClass() { }
 
    public MyClass(int age) {
        this.age = age;
    }
 
    public MyClass(String name) {
        this.name = name;
    }
 
    public MyClass(int age, String name) {
        this.age = age;
        this.name = name;
    }
}
 
class MainClass {
    public static void main(String[] ar) {
        MyClass myClass_1 = new MyClass();          // 기본 생성자로 객체 생성
        MyClass myClass_2 = new MyClass(10);        // 정수 타입 자료형 매개변수가 1개인 생성자로 객체 생성
        MyClass myClass_3 = new MyClass("이름");
        MyClass myClass_4 = new MyClass(20, "닉네임");
    }
}

 

앞에서 잠깐 언급하고 지나갔지만, 클래스의 속성을 멤버 필드 라고도 한다.

멤버 필드를 메소드 내에 정의한 지역 변수와 혼용해서 사용하기도 하는데, 구분해서 사용하는게 맞다.

메소드 내에 정의된 지역 변수는 값을 할당하지 않고 사용할 수 없는 반면

클래스 영역의 멤버 필드는 값을 할당하지 않아도 해당 데이터 타입의 기본 값으로 값이 설정 된다.

 

마지막으로 처음보는 this 라는 키워드가 있는데, 바로 다음에 살펴 보도록 하자.

 

 

 

 

this 키워드 이해하기


this 를 보면 일단 이 키워드를 감싸고 있는 가장 가까운 클래스를 나타낸다고 생각하면 된다.

javascript 를 먼저 공부했다면 this 가 나타내는 값이 꽤나 단순해졌다고 느낄 수 있다.

 

어쨌든 this는 클래스 입장에서 '나' 라고 말하는 것과 같다.

 

바로 위 생성자를 정의하는 방법에서 작성한 코드에서 MyClass 클래스를 다시 한 번 보자.

 

class MyClass {
    private int age;
    private String name;
 
    public MyClass() { }
 
    public MyClass(int age) {
        this.age = age;
    }
 
    public MyClass(String name) {
        this.name = name;
    }
 
    public MyClass(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

 

this 키워드를 꼭 생성자에서만 사용하는것은 아니지만, 생성자에서 흔히 볼 수 있다.

7라인의 정수형 타입 매개 변수 age 가 있다.

이제부터 MyClass(int age) { } 블록 내에서 이 값은 age 라는 변수를 사용하여 그 안에 담긴 값을 사용할 수 있다.

그런데 문제가 생겼다.

MyClass의 멤버 필드 영역에 속성으로 같은 타입의 변수 age 가 이미 선언되어 있기 때문이다.

 

즉, this 가 없다면 8 라인은 age = age 라고 쓰게 될 것이고, 이것은 굉장히 모호한 코드가 된다.

매개 변수 age 에 멤버 필드 age 값을 할당 한다는 것인지.

멤버 필드 age 에 매개 변수 age 값을 할당 한다는 것인지.

아니면 아무런 의미도 없이

멤버 필드 age 에 멤버 필드 age 값을 할당 한다는 것인지.

매개 변수 age 에 매개 변수 age 값을 할당 한다는 것인지.

 

사람도 혼란스러운데 컴퓨터가 구분할 수 있을리 없다.

 

이 문제를 this 키워드를 사용해서 해결할 수 있다.

(8라인에서 age = age 라고 할 경우, 둘 다 자신의 스코프에서 가장 가까운 매개변수 age를 가리킨다.)

즉, this.age는 매개 변수의 age가 아닌, 클래스 자기 자신에 선언 된 멤버 필드 age를 뜻한다는 것을 ​명시적으로​ 나타낸 것이다.

 

만약 메소드의 매개 변수의 이름과 동일한 이름의 멤버 필드가 없다면, 각자 어떤 변수를 나타내는지 모호하지 않기 때문에 굳이 this를 사용하지 않아도 된다.

 

 

다음으로 this() 메소드이다.

this() 메소드는 생성자 내에서만 쓰일 수 있으며, 자신이 속한 클래스의 생성자를 가리킨다.

심지어 작성 위치도 생성자의 최상단으로 정해져 있다. 그 사이에 어떠한 코드도 와서는 안된다.

예를 들면 다음과 같이 쓸 수 있다.

 

public class MyClass {
    public MyClass() {
        System.out.println("기본 생성자 입니다.");
    }
 
    public MyClass(int number) {
        this();
    }    
}

 

6라인과 7라인 사이에 작성할 수 있는데 딱 하나 있는데, 주석이다.

그 외 어떠한 코드도 생성자 정의와 this() 사이에 올 수 없다.

 

그럼 이 this()는 언제 사용할까?

생성자를 여러개 정의했을 때 유용하게 사용할 수 있다.

 

다음 클래스를 보자.

 

public class MyClass {
    private String str_1;
    private String str_2;
    private String str_3;
 
    private int int_1;
    private int int_2;
    private int int_3;
 
    // 기본 생성자로, 기본값으로 할당
    public MyClass() {
        this.str_1 = "str_1 기본값";
        this.str_2 = "str_2 기본값";
        this.str_3 = "str_3 기본값";
 
        this.int_1 = -1;
        this.int_2 = -1;
        this.int_3 = -1;
    }
 
    public MyClass(String str_1, int int_1) {
        this.str_1 = str_1;        // 생성자 매개변수 값으로 입력
        this.str_2 = "str_2 기본값";
        this.str_3 = "str_3 기본값";
 
        this.int_1 = int_1;        // 생성자 매개변수 값으로 입력
        this.int_2 = -1;
        this.int_3 = -1;
    }
 
    public MyClass(String str_1, int int_1, String str_2, int int_2) {
        this.str_1 = str_1;                // 생성자 매개변수 값으로 입력
        this.str_2 = str_2;                // 생성자 매개변수 값으로 입력
        this.str_3 = "str_3 기본값";
 
        this.int_1 = int_1;        // 생성자 매개변수 값으로 입력
        this.int_2 = int_2;        // 생성자 매개변수 값으로 입력
        this.int_3 = -1;
    }
}

 

위와 같은 경우가 얼마나 많을지는 모르겠지만, 이렇게 중복되는 코드가 많은 경우 다음과 같이 this() 메소드를 사용해서 작성할 수 있다.

 

public class MyClass {
    private String str_1;
    private String str_2;
    private String str_3;
 
    private int int_1;
    private int int_2;
    private int int_3;
 
    // 기본 생성자로, 기본값으로 할당
    public MyClass() {
        this.str_1 = "str_1 기본값";
        this.str_2 = "str_2 기본값";
        this.str_3 = "str_3 기본값";
 
        this.int_1 = -1;
        this.int_2 = -1;
        this.int_3 = -1;
    }
 
    public MyClass(String str_1, int int_1) {
        this();                    // 기본 생성자 메소드 호출
        this.str_1 = str_1;        // 생성자 매개변수 값으로 입력
        this.int_1 = int_1;        // 생성자 매개변수 값으로 입력
    }
 
    public MyClass(String str_1, int int_1, String str_2, int int_2) {
        this(str_1, int_1);        // 매개변수가 일치하는 생성자 호출
        this.str_2 = str_2;        // 생성자 매개변수 값으로 입력
        this.int_2 = int_2;        // 생성자 매개변수 값으로 입력
     }
}

 

28라인처럼 매개변수를 입력하면, 타입과 개수가 일치하는 생성자를 호출한다.

그래서 28라인의 코드는 21라인의 생성자를 호출하고, 그 안에서 다시 11라인의 기본 생성자를 호출하게 된다.

 

 

마지막으로 정리 할 내용에는 없지만, this와 생성자 관련해서 키워드가 하나 더 있다.

super와 super() 인데, this와 달리 super는 자신의 부모 클래스와 부모 클래스의 생성자를 호출할 때 사용할 수 있다.

 

 

 

 

728x90

'Archive > Java online live study S01' 카테고리의 다른 글

7주차 : 패키지  (0) 2021.05.01
6주차 : 상속  (0) 2021.05.01
4주차 : 제어문  (0) 2021.05.01
3주차 : 연산자  (0) 2021.05.01
2주차 : 자바 데이터 타입, 변수 그리고 배열  (0) 2021.05.01

+ Recent posts