상세 컨텐츠

본문 제목

클래스의 관계, 단일 상속, Object 클래스, 오버라이딩, super, super()

자바강좌

by somiyuralove 2019. 3. 12. 23:56

본문

이번시간에는 클래스간의 포함 관계에 대해서 알아보는 시간을 가져보겠습니다.

상속에서 부모와 자식간의 관계를 맺어주어 코드의 재사용성과 효율을 높혔는데, 포함(Composite)관계를 맺어줌으로해서 동일한 효과를 가져올 수 있습니다.

클래스간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스를 선언하는 것을 뜻합니다.

class Circle {

int x; // 원점의 x좌표

int y; // 원점의 y좌표

int r; // 반지름

}

class Point {

int x; // x좌표

int y; // y좌표

}

Point클래스를 재사용해서 Circle 클래스를 코딩한다면 아래와 같습니다.

class Circle {

Point p = new Point(); 

int r;

}

위와같이 한 클래스를 코딩하는데 있어서 다른 클래스를 포함(Composite)시키는 것은 효율적인 방법입니다.

하나의 거대한 클래스를 작성하는 것 보다 단위별로 여러개로 쪼개어서 클래스를 작성하여 포함시키는 것은 보다 간결하고 손쉽게 클래스를 작성할 수 있습니다.

여기서 우리가 한가지 생각해야할 점은 클래스를 작성함에 있어서 상속관계를 맺어줄 것인지 포함관계를 맺어줄 것인지 결정하는 것을 고민해야할 상황에 놓이게 됩니다.

클래스이 관계를 맺어줄때 is a (~은 ~이다)와 has a(~은 ~을 가지고 있다)를 넣어서 문장을 만들어보면 관계를 좀 더 명확히 규명할 수 있습니다.

위의 Circle 클래스와 Point 클래스는 원은 점을 가지고 있다라고 표현하는게 이치에 합당한 관계설정이라고 할 수 있습니다.

상속관계는 is a 이고 포함관계는 has a 입니다.

C++에서는 다중상속을 허용하지만, 자바에서는 단일상속만 허용합니다.

다중상속을 허용하면, 여러 클래스로부터 상속을 받을 수 있기 때문에 복합적인 기능을 쉽게 구현할 수 있지만, 클래스간의 관계가 매우 복잡해지는 단점이 있습니다.

이런 단점때문에 자바에서는 다중상속의 이점을 포기하고 클래스간의 관계를 명확하게 해주기 위해 단일상속만을 허용합니다.

만약 여러분이 아무런 상속도 없이 Car클래스를 만들었다고 하더라도 모든 클래스의 조상은 Object클래스를 상속받은 것과 같은 의미입니다.

Object클래스는 모든 클래스들의 조상이입니다.

지금까지 여러분들이 toString()이나 equals()와 같은 메서드를 사용할 수 있었던 것도 Object클래스에 toString()이나 equals() 메서드가 정의되어 있었기 때문입니다. 이밖에도 기본적인 메서드들이 있으니 API문서를 참고 하시기 바랍니다.

오바라이딩(overriding)이란 조상클래스로부터 상속받은 메서드를 자손클래스에서 자신의 용도에 맞게 메서드를 변경하는 것을 말합니다.

* 오버라이딩의 조건 

- 메서드 이름, 매개변수 이름, 리턴타입이 같아야 합니다.

- 접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없습니다. ( 만일 조상클래스의 메서드가 protected로 설정되어 있으면, 오버라이딩한 자손클래스에서는 protected나 public로 접근제어를 설정하여야 합니다. )

- 조상클래스의 메서드보다 많은 수의 예외를 선언 할 수 없습니다.

- 인스턴스메서드를 static 메서드로, static메서드를 인스턴스 메서드로 변경할 수 없습니다.

오버로딩(overloading)과 오버라이딩(overriding)의 차이점은 오버로딩은 기존에 없는 새로운 메서드를 정의하는 것이고, 오버라이딩은 상속받은 메서드의 내용을 변경하는 것입니다.

class Parent {

void parentMethod() { }

}


class Child extends Parent {

void parentMethod() {} // 오버라이딩

void parentMethod(int i) {} // 오버로딩

}

super는 자손클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수입니다.

멤버변수와 지역변수의 이름이 같을때 this를 사용해서 구별했듯이 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 사용해서 구별할 수 있습니다.

super()는 조상클래스의 생성자를 호출하는데 사용합니다.


 



관련글 더보기

댓글 영역