객체지향 프로그래밍 기초 (2)

강호수·2022년 9월 5일
1

생성자(Constructor)

  • 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드
    • 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.
    • 생성자는 리턴 타입이 없다.
class Car {
	public String model;
    public String color;
    
    public Car(){} //기본생성자 (생성자 없으면 자동생성)
    
    //생성자 오버로딩
    public Car(String model, String color){ //매개변수가 있는 생성자
    	this.model = model;
        this.color = color;
    }
}

위의 코드와 같이 class에서 생성자를 만들 수 있다.

기본 생성자

지금까지 생성자를 따로 만들지 않아도 정상적으로 인스턴스를 만들 수 있던 이유는 자바 컴파일러가 기본 생성자를 자동으로 추가해 주었기 때문이다.
기본 생성자는 매개변수가 없는 생성자를 의미한다.
-> 만약 생성자가 이미 추가되어 있다면 그 생성자를 기본으로 사용하게 된다.

매개변수가 있는 생성자

적어둔 Car class를 통해 생성자를 생성해보자

public class ConstructorEx {
	public static void main(String[] args) {
    	Car c = new Car("hyundai", "회색");
    }
}

위와 같이 Car 인스턴스를 생성할 때 매개변수가 있는 생성자를 사용하게 되면 인스턴스의 필드값을 일일히 설정해줄 필요가 없어지고, 동시에 원하는 값으로 설정할 수 있어진다.

this()

자신이 속한 class에서 다른 생성자를 호출하는 경우에 사용한다.

class Ex {
	public Ex() { }
    public Ex(int x) { 
    	this();
    }
}

위와 같이 만들게 되면 만약 main문에서 Ex(5)와 같이 선언하게 되면 두개의 생성자가 동시에 실행된다.

this

this()와 생긴건 비슷하지만 쓰임새가 다르다.

private String modelName;
private string color;

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

먼저 설명하자면 this.modelName은 private String으로 선언한 class 하위의 modelName을 뜻하고 modelName은 String으로 선언한 지역변수를 뜻한다.
즉 this를 붙이게 되면 자신이 포함된 클래스의 객체(인스턴스 자신)를 가리키게 된다.

내부 클래스

  • 클래스 내에 선언된 클래스 (외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용)
  • 외부 클래스의 멤버들에게 쉽게 접근할 수 있고, 코드의 복잡성을 줄일 수 있다.

인스턴스 내부 클래스

class OutClass { // 외부 클래스
	private int a = 1; // 외부 클래스 인스턴스 변수
    private static int b = 2; // 외부 클래스 정적 변수
    
    private InClass inClass; // 내부 클래스 자료형 변수 선언
    
    public OutClass() {
    	inclass = new InClass(); // 외부 클래스 생성자
	}
    
    class InClass { // 인스턴스 내부 클래스
    	int inNum = 100; // 내부 클래스 인스턴스 변수
        
        void Test() { ... }
	}
    
    public void testClass() {
    	inClass.Test();
	}
}

public class Main {
	public static void main(String[] args) {
    	OutClass outClass = new OutClass();
        outClass.testClass(); // 내부 클래스 기능 호출
	}
}

Main문에서 OutClass outClass = new OutClass(); 를 실행하면 OutClass에 있는 기본 생성자까지 같이 실행된다 (inClass에 new InClass() 주입)

  • 의문점
private InClass inClass;
public OutClass() {
	inclass = new InClass();
}
public void testClass() {
	inClass.Test();
}

내부 클래스 자료형 변수를 저렇게 따로 설정할 필요가 있나 싶은 생각이 들었다.

  • 해결
    • InClass inClass를 testClass()로 넣어버릴 경우에 당장 출력이 잘 되긴 하지만 딱 그 현상에 국한되어서 실행될 수 있다. 다른 기능들을 추가로 넣을 때에 그때마다 새로 선언 해주어야 할 수도 있다.
    • OutClass() 생성자 안에 들어있는 inclass는 this.inclass와 같은 것으로 같은 것이 없는 경우에는 생략 가능하다

정적 내부 클래스

class ~~ {
	static class ~~ {
    }
}

위와 같이 내부 class에 static이 붙어 있는 것을 말하는데, 이것은 외부 클래스에서도 정적 멤버들만 사용할 수 있다.

지역 내부 클래스

class ~~ {
	void ~~() {
    	class LocalInClass {
        }
        LocalInClass localInClass = new LocalInClass();
        localInClass.~~();
	}
}

클래스 안에 있는 메서드 내에서 정의되는 클래스를 지역 내부 클래스라 한다.

0개의 댓글