프로그래밍/JAVA

[JAVA의 정석]Ch7_객체지향_생성자와 상속

개발자 덕구🐾 2022. 7. 7. 16:15
728x90

 

1-1. 생성자요?

 

생성자는 인스턴스가 생성될 때 호출되는 "인스턴스 초기화 메서드"이다. 

 

생성자는 1. 리턴 값이 없고, 2. 생성자의 이름과 클래스의 이름은 같아야한다.

+ 생성자도 오버로딩이 가능하다.

 

 

생성자는 인스턴스를 생성하는 것이 아니고 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다. 

 

사실 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야한다. 

지금까지 생성자 없이 인스턴스를 생성할 수 있었던 이유는 기본 생성자(Default constructor) 덕분이다.

 

기본 생성자는 컴파일러가 제공하는 생성자로 아무것도 하지 않아도 알아서 넣어준다. 

이것은 클래스 내에 '생성자가 하나도 없을 때 '뿐이라는 것을 명심-!!

 

 

생성자를 이용한다면  인스턴스를 생성하는 동시에 원하는 값으로 초기화를 할 수 있게 된다. 

이것은 코드를 보다 간결하고 직관적인, 객체지향적인 코드를 작성할 수 있다. 

 

 

생성자가 없다면 인스턴스 생성과 초기화를 따로 진행해주어야한다. 

 

 

생성자 간에도 서로 호출할 수 있다.  (같은 클래스의 다른 생성자를 호출)

다만 생성자의 이름으로 this를 사용하고 반드시 첫 줄에서만 호출이 가능하다.

 

 

class Car2{
    String color;
    String gearType;
    int door;

    Car2() {
        this("white", "auto", 4);
    }

    Car2(String color){
        this(color, "auto", 4);
    }

    Car2(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door =  door;
    }
}

 

 

위 코드의 Car2의 매개변수가 3개인 생성자에서 this를 사용한다. 

그 이유는 인스턴스 변수인 color과 첫 번째 매개변수인 color이 동일하기에 두 변수가 서로 구별이 안되기 때문이다. 

이러한 경우 인스턴스 변수 앞에 예약어인 'this'를 사용하면 된다. 

[인스턴스 변수와 매개변수를 구분하기 위해 사용한다.] 

 

 

이름을 다르게 설정하는 것보다 this를 이용하는 것이 더 명확하며 이해하기 쉽다. 

'this'는 참조변수로 인스턴스 자신을 가리킨다. 

 

 

위에 있는 생성자의 this()와는 완전히 다르다---!!!

 

+ 지역변수는 초기화가 필수라는 것을 잊지말기 

 

 

 


 

 

 

1-2. 상속이요?

 

기존의 클래스를 재사용하여 새로운 클래스르 작성하는 것 

 

 

새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 'extends'와 함께 써주면 된다. 

상속해주는 클래스를 '조상 클래스'라고 상속 받는 클래스를 '자손 클래스'라고 한다. 

자손 클래스는 조상 클래스의 public , protected로 선언되어있는 모든 변수와 메서드를 상속받는다. 

 

 

클래스 다이어그램에서 자식 -> 부모 클래스를 가리켜 상속관계를 나타낸다. 

 

 

조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받지만,

자손 클래스가 변경되면 조상 클래스에 아무런 영향을 주지 못한다. 

 

 

자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에

따로 조상 클래스의 인스턴스를 생성하지 않아도 조상 클래스의 멤버들을 사용할 수 있다. 

 

 

 

 


 

 

 

< 확장을 한 클래스가 생성자를 호출하면, 자동으로 부모 클래스의 기본 생성자가 호출된다.> 

그래서 부모 클래스의 생성자 -> 자식 클래스의 생성자 순으로 호출된다. 

즉, 부모 클래스에는 기본 생성자가 있어야만한다.   다른 생성자를 만들어놓고 기본 생성자가 없다면 에러난다. 

 

 

 

main에서 이런 식으로 자식 객체를 만들고 부모 클래스의 함수(pringName)을 실행해보았다. 

public class Main {

    public static void main(String[] args) {
        Child child = new Child();
        child.printName();
    }

}

 

 

 

 

부모 생성자가 먼저 호출되고 그 다음 자식 생성자가 호출되는 것을 볼 수 있다. 

 

 

 

 

상속 관계에서 자식 클래스가 부모 클래스의 메서드를 동일하게 선언하는 것을 오버라이딩이라고 한다. 

 

해당 포스팅 참고 : 

https://what-am-i.tistory.com/68?category=1000403 

 

JAVA - 메소드 오버라이딩[overriding]과 오버로딩

1. 오버라이딩 이란? ; _ 사전적인 뜻 : 다른 무엇보다 더 중요한 부모클래스에게 상속받은 메서드를 자식클래스에 맞도록 수정하는 것 (상속관계에서) 오버라이딩은 메서드의 내용만을 새로 작

what-am-i.tistory.com

 

 

 

자바는 다중 상속 안된다!!

 

 


 

 

 

 

 

포함관계 (composite)

한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다. 

 

class point{
    int x; // x좌표
    int y; // y좌표
}
class circle{
    point c = new point(); // point를 멤버 변수로 선언 
    int r; // 반지름 
}

 

 

 

 

상속관계와 포함관계를 구분하는 방법은

상속 관계 :  'is - a' ~은 ~이다.

포함 관계 : 'has - a' ~은 ~을 가지고 있다. 

 

 

다중 상속을 허용하는 C++과는 달리 자바에서는 단일 상속만을 지원한다.

이는 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어준다. 

 

 

Object 클래스는 모든 클래스의 상속계층도의 최상위에 있는 조상 클래스이다. 

상속 받지 않는 모든 클래스들을  자동으로 Object 클래스로부터 상속받게 함으로써 이것을 가능하게 하였다. 

< 자동적으로 extends Object 가 추가 된다.>

 

즉, 자바의 모든 클래스는 Object의 멤버를 상속 받기 때문에 Object 클래스에 정의된 멤버들을 사용할 수 있다. 

 

 

 

오버 라이딩 내용은 여기서 확인! 

https://what-am-i.tistory.com/68?category=1000403 

 

JAVA - 메소드 오버라이딩[overriding]과 오버로딩

1. 오버라이딩 이란? 부모클래스에게 상속받은 메서드를 자식클래스에 맞도록 수정하는 것 (상속관계에서) 2. 오버라이딩의 규칙 1) 부모클래스의 메서드와 동일한 시그니쳐와 반환타입을 가진

what-am-i.tistory.com

 

 

 

 


 

 

 

 

super 

 

변수로 사용 : 상속받은 멤버와 자신의 멤버가 이름이 같을 때 super 를 붙여 구분하도록 도와주는 참조변수이다. (부모 클래스의 변수를 가리킴)

 

메서드로 사용 : super() 는 부모 클래스의 생성자를 호출함을 의미한다. 

반드시 자식 클래스의 '생성자의 첫줄'에 있어야한다. 

 

 

 

 

package

클래스의 묶음 

패키지는 물리적으로 하나의 디렉토리이다. 

 

 

package 패키지명;

을 쓰면 해당 소스 파일에 포함된 모든 클래스나 인터페이스는 선언된 페키지에 속하게 된다. 

 

 

 

static

static은 '클래스의' 또는 '공통적인'의 의미를 갖고있다. 

static 메서드로 하는 것이 인스턴스를 생성하지 않고도 호출이 가능해서 더 편리하고 속도도 더 빠르다. 

 

 

abstract

'미완성'의 의미를 가진다. 

 

abstract가 클래에 사용되면 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.

메서드에 사용되면 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다. 

 

 

 

반응형