[Java] 객체지향 프로그래밍(2)

Minit88·2023년 2월 24일
0

[Java]

목록 보기
7/18
post-thumbnail

Lab_01 - 생성자

생성자는 말 그대로 객체를 생성하는 역할을 하는 클래스의 구성 요소로서, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드라 정리할 수 있습니다.

new 키워드

인스턴스 생성을 담당하는 것은 new 키워드이며, 생성자는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드라 한다.

  • 생성자 이름은 반드시 클래스의 이름과 같아야한다.
  • 생성자는 리턴 타입이 없다.
클래스명(매개변수) { // 생성자 기본 구조
	...생략...
}

기본 생성자

지금까지 생성자의 존재를 모르고 new 키워드를 사용하여 생성자를 호출하여 객체를 만들었지만, 사실 모든 클래스에는 반드시 하나 이상의 생성자가 존재해야한다.
기본 생성자는 매개변수가 없는 생성자를 의미한다.

클래스명(){} //기본 생성자

DefaultConst(){} // 예시) DefaultConst 클래스의 기본 생성자

매개 변수가 있는 생성자

public class ConstructorExample {
    public static void main(String[] args) {
        Car c = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + c.getModelName() + "이고, 컬러는 " +  c.getColor() + "입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.

위 코드를 보면 class car 안에 public Car(String modelName, String color, int maxSpeed) 가 있고 클래스 오버라이딩이 발생하여 생성자가 선언됨을 알 수 있다. 이때 생성자는 매개변수를 가지게 된다. 따라서 생성자를 호출할 때에도 Car(value1,value2)의 형태로 호출이 되었다.

this()

클래스 안에 메서들끼리도 서로 호출이 가능해진다. 이때 호출을 위해 사용하는 메서드는 this()이다 .
this 메서드를 사용하기 위해 두 가지의 문법요소를 충족해야 한다.

  • this() 메서도는 반드시 생성자의 내부에서만 사용할 수 있다.
  • this() 메서드는 반드시 생성자의 첫 줄에 위치해야 한다.

이 두가지를 유념해 코드를 보면

public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        Example example2 = new Example(5);
    }
}

class Example  {
    public Example() {
        System.out.println("Example의 기본 생성자 호출!");
    };

    public Example(int x) {
        this();
        System.out.println("Example의 두 번째 생성자 호출!");
    }
}

//Output
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!

으로 나타나며 Example(int x) 부분에 this()가 선언되었고, 이때 this()는 Example() 생성자를 호출하게 된다.

this 키워드

public class ConstructorExample {
    public static void main(String[] args) {
        Car car = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " +  car.getColor() + "입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.

인스턴스 변수로 modelName ,color , maxSpeed가 선언되어 있는데 동시에 생성자의 매개변수로 선언되어있다. 인스턴스 변수와 매개변수를 이름만으로는 구분하기가 어려워지는 문제가 발생하게 되는데, 이를 구분해주기 위한 용도로 주로 사용되는 방법이 바로 this 키워드라 할 수 있다.
만약, 위 코드에서 this.modelName = modelName 대신 modelName = modeName 라고 작성하면 둘 다 지역변수로 간주되게 된다.

this는 인스턴스 자신을 가리키며, 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것 처럼 this를 통해서 인스턴스 자신의 변수에 접근할 수 있다.

Lab_02 - 내부 클래스

내부 클래스는 클래스 내에 선언된 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다.

외부적으로 불필요한 데이터를 감출 수 있어,객체지향의 중요한 핵심 원칙인 캡슐화를 달성하는데 유용하다

class Outer { // 외부 클래스
	
	class Inner {
		// 인스턴스 내부 클래스	
	}
	
	static class StaticInner {
		// 정적 내부 클래스
	}

	void run() {
		class LocalInner {
		// 지역 내부 클래스
		}
	}
} 

위 코드를 통해 세가지 내부 클래스의 종류를 알 수 있다.

인스턴스 내부 클래스

  • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언

스태틱 내부 클래스

  • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static 멤버처럼 다루어진다. 주로 외부 클래스의 static멤버, 특히 static 메서드에서 사용될 목적으로 선언

지역 내부 클래스

  • 외부 클래스의 메서드나 초기화 블럭 안에 선언하며 선언된 영역 내부에서만 사용될 수 있다.

익명 클래스

  • 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스

🎓Reference

자바의 정석 생성자
자바의 정석 내부클래스

profile
" To be BE "

0개의 댓글