본문 바로가기
Study/Java Study

자바스터디 4주차 (1)

by hongchii 2021. 5. 31.
728x90
반응형

2021.05.30 - [Study/Java Study] - 자바스터디 3주차 (3) [빙고 게임 구현 - 2차원 배열 이용]

 

자바스터디 3주차 (3) [빙고 게임 구현 - 2차원 배열 이용]

2021.05.26 - [Study/Java Study] - 자바스터디 3주차 (2) 자바스터디 3주차 (2)  1. 객체지향언어의 특징 코드의 재사용성이 높다. 코드의 관리가 용이하다. 신뢰성이 높은 프로그래밍을 가능하게 한다. 2.

hong-chii.tistory.com

 

1. 상속

1.1 상속의 정의와 장점

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
상속을 통해서 클래스를 작성하면 코드의 추가 및 변경이 매우 용이하다.
상속을 구현하는 방법은 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 extends와 함께 써주면 된다.

 

class Child extends Parent {

}



Child클래스는 Parent클래스를 상속받는다.
여기서 상속을 해주는 Parent클래스는 조상클래스이고 상속을 받는 Child클래스는 자손클래스이다.

조상클래스 : 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스
자손클래스 : 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스


만일 Parent클래스에 age라는 정수형 변수를 멤버변수로 추가하면 Parent클래스를 상속받는 Child클래스는 자동적으로 age변수가 추가 된 것과 같은 효과를 얻는다.


반대로 Child클래스에 play()메서드를 추가하면 어떻게 될까?


Parent클래스는 영향을 받지않고 Child클래스에만 추가가 된다.

 

- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.


클래스간의 상속관계를 적절히 맺어 주는 것이 객체지향 프로그래밍에서 가장 중요한 부분이다.

 

 


1.2 클래스간의 관계 - 포함관계


상속이외에 클래스를 재사용하는 방법이 있는데, 그것은 클래스간에 포함(Composite) 관계를 맺어 주는 것이다.

class Circle{
      int x;
      int y;
      int r;
}

class Point {
      int x;
      int y;
}


class Circle{
      Point c = new Point();
      int r;
}


1.3 클래스간의 관계 결정하기

 

클래스간의 관계를 명확하게 확인하는 방법은 is a 와 has a를 대입해보면 된다.

예를들어, 원(Circle)은 점(Point)d이다. - Circle is a Point. 원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point.

이렇게 비교해보고 "~은 ~이다." 라는 문장이 성립한다면, 서로 상속관계 맺어주고,

"~은 ~을 가지고 있다." 는 문장이 성립한다면 포함관계 맺어 주면 된다.

 

 

1.4 단일 상속

 

자바에서는 오직 단일 상속만을 허용한다.

 

 

1.5 Object클래스

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

 

 


 

2. 오버라이딩(overriding)

 

2.1 오버라이딩이란?

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.

상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야하는 경우 조상의 메서드를 오버라이딩한다.

 

 

2.2 오버라이딩의 조건

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 1.이름이 같아야하고 2.매개변수가 같아야한다. 그리고 3.반환타입이 같아야한다.

 

조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때 

1. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

2. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

3. 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

 

2.3 오버로딩 vs 오버라이딩

오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것 (new)
오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것 (change, modify) 

 

2.4 super

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

멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구별할 수 있다.

 

2.5 super() - 조상 클래스의 생성자

this()와 마찬가지로 super() 역시 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만, super()는 조상 클래스의 생성자를 호출하는데 사용된다.

조상 클래스 생성자의 호출은 클래스의 상속관계를 거슬러 올라가면서 계속 반복되고, 모든 클래스의 최고 조상인 Object클래스의 생성자인 Object()까지가서야 끝이나기때문에  Object클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야한다. 그렇지 않으면 컴파일러가 자동적으로 생성자의 첫 줄에 super();를 추가한다.

 


3. package와 import

 

 

3.1 패키지(package)

패키지란, 클래스의 묶음이다. 

- 하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
- 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
- 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.

 

3.2 패키지의 선언

package 패키지명;
클래스나 인터페이스의 소스파일(.java)의 맨 위에 다음과 같이 한 줄만 적어주면 된다.
패키지명은 클래스명과 쉽게 구분하기 위해서 소문자로 하는 것을 원칙으로 한다.

 

3.3 import문

다른 패키지의 클래스를 사용할 때 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.

ctrl+shift+o 를 누르면, 자동으로 import문을 추가해준다.

 

3.4 import문의 선언

import문은 한 소스파일에 여러 번 선언할 수 있고, 구성은 아래와 같다.

1. package문
2. import문
3. 클래스 선언

import문을 선언하는 방법

import 패키지명.클래스명;
	또는
import 패키지명.*;

3.5 static import문

static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있어서 특정 클래스의 static멤버를 자주 사용할 때 편리하고, 코드도 간결해진다.

 

 

 

 

자바의 정석을 토대로 공부 후 정리한 내용입니다.

728x90
반응형

댓글