일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- MySQL
- 밑바닥부터시작하는딥러닝2
- Crawling
- 한빛미디어
- aws
- image
- word2vec
- 생활코딩
- attention
- 예제중심HTML&자바스크립트&CSS
- 비지도학습
- Apache
- 머신러닝
- 딥러닝
- 한빛아카데미
- 크롤링
- 컴파일설치
- Lamp
- Selenium
- jupyter
- CBOW
- 소스설치
- 수동설치
- 셀레니움
- AndroidStudio를활용한안드로이드프로그래밍
- 논문리뷰
- 프로그램새내기를위한자바언어프로그래밍
- 밑바닥부터시작하는딥러닝
- 가비아
- deeplearning
- Today
- Total
안녕, 세상!
5. 클래스 상속 본문
상속의 개념
상속은 부모 클래스가 갖고 있던 모든 멤버 필드와 메소드를 그대로 자식 클래스에게 상속을 함으로써 자식 클래스는 부모 클래스에서 정의된 필드와 메소드를 정의하지 않아도 정의한 것과 같은 효과가 생깁니다.
상속을 할 때 기능을 물려주는 부모 클래스를 슈퍼 클래스(super class)라고 하고, 자식 클래스를 서브 클래스(sub class)라고 합니다.
서브 클래스는 슈퍼 클래스로 부터 상속을 받게 되면 슈퍼 클래스의 기능을 그대로 이어 받으면서 새로운 기능을 추가하고 기존의 기능을 수정할 수 있습니다.
기존의 기능을 수정할 때는 오버라이딩을 사용해서 수정이 가능합니다.
상속의 장점
1. 클래스 간 기능의 중복 정의 불필요
2. 필드와 메소드를 재사용함으로써 클래스 간결화
3. 클래스 간 계층적 분류 및 관리
(1) 클래스 상속과 객체
부모 클래스를 상속하여 자식 클래스를 생성하기 위해서는 extends 키워드를 사용해야 합니다.
class 자식클래스 extends 부모클래스
{
....
자식 클래스에 추가할 필드와 메소드
....
}
상속의 예시는 다음과 같습니다.
② 클래스 상속의 특징
1. 자바에서는 다중 상속을 지원하지 않습니다.
- extends 키워드 다음에는 오직 1개의 클래스만을 지정할 수 있음
2. 상속의 횟수에 제한이 없습니다.
- 부모의 상속을 받은 자식클래스가 누군가의 부모 클래스가 될 수 있음
3. 최상위 클래스는 java.lang.Object 클래스입니다.
- 자바의 모든 클래스는 Object 클래스를 자동으로 상속받도록 컴파일이 됩니다.
③ 상속과 접근 지정자
상속이 이루어진 상태에서 부모 클래스와 자식 클래스 간에 접근 지정자는 다음과 같습니다.
부모 클래스의 각 멤버에 접근하는 클래스 | 멤버의 접근 지정자 | |||
default | private | protected | public | |
같은 패키지의 클래스 | o | x | o | o |
다른 패키지의 클래스 | x | x | x | o |
같은 패키지의 자식 클래스 | o | x | o | o |
다른 패키지의 자식 클래스 | x | x | o | o |
④ 상속과 생성자
상속을 한 경우에 부모 클래스와 자식 클래스의 생성자 관계가 있습니다.
부모 클래스를 상속하여 자식 클래스를 생성하게 생성자 역시 자동으로 이어 받습니다.
그런데 자식 클래스가 자신의 생성자를 만들게 되면 자식 클래스에 있는 생성자는 부모 클래스의 생성자 기능을 포함하고 있으므로 우선 부모 클래스의 생성자를 먼저 실행하고 다음으로 자식 클래스에 포함된 생성자를 실행하게 됩니다.
super 키워드
super 키워드는 해당 클래스의 부모 클래스를 지칭합니다.
만약 부모 클래스의 생성자가 2개고 자식 클래스의 생성자도 2개일 경우 자식 클래스에서 부모 클래스의 생성자 2개 중 원하는 생성자를 호출하려면 super 키워드를 사용해서 이를 해결할 수 있습니다.
이를 아래 예시로 설명하겠습니다.
main 함수에서 자식 클래스를 객체로 만들 때 인수를 넣어서 인수받는 생성자가 실행되기 전 부모 클래스가 실행이 된것을 볼 수 있습니다.
그런데 부모 클래스의 생성자는 2개가 존재하므로 기본으로 인수가 없는 생성자가 호출 되는것을 볼 수 있습니다.
여기서 자식 클래스의 인수가 있는 생성자가 실행시킬 때 그 전에 인수가 있는 부모 클래스의 생성자를 호출하게 하려면 다음과 같이 super 키워들 이용하면 됩니다.
자식클래스의 인수를 받는 생성자에 super(24); 를 넣어서 부모 클래스의 인수를 받는 생성자를 먼저 호출 시킬 수 있게 되었습니다.
(2) 메소드 오버라이딩
상속을 하는 경우에 자식의 클래스는 부모 클래스의 메소드의 기능을 수정할 수 있다고 했습니다.
이 기능의 수정은 부모 클래스의 메소드와 동일한 이름의 메소드를 다시 정의하고, 해당 메소드가 수행하는 기능을 다르게 코딩하여 새롭게 정의된 메소드가 실행됨으로써 기능을 수정할 수 있습니다.
이를 메소드 오버라이딩(Method Overriding)이라고 합니다.
메소드 오버라이딩이 성립하기 위해서는 상속할 때 부모 클래스에서 제공하는 메소드와 동일한 이름, 같은 개수의 인수, 같은 유형의 인수, 같은 반환 유형을 갖는 메소드를 다시 만들어야 합니다.
다음은 오버라이딩의 예시입니다.
자식 클래스가 부모 클래스의 catsound() 메소드를 수정해서 부모 클래스의 catsound() 출력값인 "야옹" 이 아닌 "미야옹" 이 출력된 것을 확인할 수 있습니다.
위의 예시에서 super 키워드를 활용해서 부모 클래스의 catsound() 메소드도 호출할 수 있습니다.
오버로딩과 오버라이딩
앞서 두 개 모두 설명을 했습니다.
이름이 서로 비슷하지만 수행하는 역할은 크게 다릅니다.
이를 표로 정리해서 혼동되지 않도록 하겠습니다.
비교 요소 | 메소드 오버로딩 | 메소드 오버라이딩 |
정의 | 동일한 클래스나 상속 관계에서 동일한 이름의 메소를 중복 작성함 | 자식 클래스에서 부모 클래스에 있는 메소드와 동일한 이름의 메소드를 다시 정의함 |
관계 | 동일한 클래스 내 혹은 상속 관계 | 상속 관계 |
목적 | 이름이 같은 여러 개의 메소드를 중복 정의하여 사용의 편리성 향상 | 부모 클래스에 구현된 메소드를 무시하고 자식 클래스에서 새로운 기능의 메소드를 재정의하여 사용함 |
조건 | 메소드 이름은 반드시 동일함. 메소드의 인수의 개수나 인수의 유형이 달라야 함 | 메소드의 이름, 인수의 유형, 인수의 개수, 인수의 반환 유형 등이 모두 동일해야 함 |
바인딩 | 정적 바인딩. 컴파일 시에 중복된 메소드 중 호출되는 메소드 결정 | 동적 바인딩. 실행 순간에 오버라이딩된 메소드를 찾아 호출함 |
(3) 추상 클래스와 인터페이스
① 추상 메소드
추상 메소드는 함수가 선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 이름만 선언되어 있는 메소드입니다.
추상 메소드를 작성할 때는 abstract 키워드와 함께 메소드의 유형, 이름, 인수 리스트만 선언해야 합니다.
abstract 반환형 메소드이름(인수,...);
예시
abstract void Method1( );
public abstract void Method2(int k);
abstract int Method3( );
이러한 추상 메소드의 구현은 해당 클래스를 상속받은 자식 클래스에서 메소드 오버라이딩을 이용하여 구현하도록 되어 있습니다.
② 추상 클래스(abstract class)
추상 클래스는 추상 메소드를 하나라도 갖고 있는 클래스를 말합니다.
추상 클래스는 클래스 앞에 abstract 키워드를 반드시 붙여야 합니다
또한 추상 메소드를 포함하지 않더라도 클래스의 이름 앞에 abstract 키워드가 붙은 클래스는 추상 클래스가 됩니다.
abstract class 클래스이름
{
....
필드
....
abstract void Method1( );
....
}
추상 클래스는 추상 클래스를 상속받는 자식 클래스를 생성할 때 자식 클래스가 추상 메소드를 그 기능에 맞게 구현하도록 설계된 클래스입니다.
추상 클래스는 그 자체가 직접 사용되지 않기 때문에 객체로 생성할 수 없습니다.
추상 클래스를 상속받은 자식 클래스가 추상 메소드를 기능에 맞게 구현하지 않고 그대로 상속하게 되면 해당 자식 클래스도 역시 추상 클래스가 됩니다.
예시를 통해서 추상 클래스를 이해할 수 있을 것입니다.
추상 클래스와 자식 클래스가 하나의 파일에 존재할 수도 있지만 별도의 파일에 추상 클래스를 상속받을 수도 있습니다.
이클립스에서는 다음과 같은 경로로 구현할 수 있습니다.
[File] -> [New] -> [Class]
③ 인터페이스(Interface)
인터페이스는 추상 클래스를 좀 더 보완해서 만든 개념으로 실제 구현하여야 할 메소드만 정의되어 있고 실제 구현은 인터페이스를 상속한 클래스에서 코딩하도록 지정된 것입니다.
추상 클래스는 추상 메소드 이외에도 일반 메소드도 포함될 수 있어 자신의 기능이 들어갈 수 있지만, 인터페이스는 모든 메소드가 추상 메소드이어야 합니다.
그리고 필드는 포함할 수 있으나 상수만 가질 수 있습니다.
즉, 인터페이스는 자신의 기능은 없고 단지 특정 기능과 연결될 수 있는 메소드 이름, 유형, 상수만을 가질 수 있습니다.
인터페이스를 선언하기 위해서 interface 키워드를 사용합니다.
publilc interface 인터페이스이름
{
....
상수
....
추상 메소드
....
}
예시
public interface intfc1 {
public static fianl int abc =123;
abstract public void Method1;
abstract public void Method2;
}
public interface intfc2 {
int abc = 200;
void Method3;
int Method4;
}
인터페이스에 포함될 수 있는 것은 상수와 추상 메소드뿐이므로 인터페이스에 포함되는 메소드에는 abstract 키워드를 생략할 수도 있습니다.
모든 메소드는 public 으로 간주되며, public 키워드를 생략해도 public 특성을 갖게 됩니다.
또한 상수 선언 시 static final 을 생략 가능합니다.
인터페이스를 이용하여 객체를 생성할 수 없으며 인터페이스는 다른 인터페이스에 상속될 수 있습니다.
일반 클래스 상속과 다르게 여러 개의 부모 인터페이스를 이용하여 다중 상속이 가능합니다.
하나의 인터페이스는 각각 별도의 파일로 저정해야 합니다.
이클립스에서는 다음과 같은 경로로 구현할 수 있습니다.
[File] -> [New} -> [Interface]
인터페이스 구현
인터페이스를 상속받은 클래스에서는 인터페이스에 포함되어 있는 모든 추상 메소드를 반드시 구현해야 합니다.
상속받은 인터페이스에 포함되어 있는 추상 메소드 중 한 개라도 구현하지 않은 경우에는 오류가 발생합니다.
만일 구현이 필요 없는 추상 메소드의 경우에는 코드가 없는 빈 메소드로 구현하면 됩니다.
인터페이스를 구현하기 위해서는 implements라는 키워드를 사용하면 됩니다.
public class 클래스이름 implements 인터페이스1, 인터페이스2...
{
....
추상 메소드의 구현
....
}
다음은 인터페이스를 구현한 예시입니다.
위와 같이 인터페이스의 모든 메소드를 구현시켜야 오류없이 결과가 잘 나오는 것을 확인할 수 있습니다.
인터페이스 vegetables 에서의 dht 메소드는 구현할 필요가 없어서(필자 마음) 상속 받은 클래스에서 빈 코드로 구현했음을 확인할 수 있습니다.
'It공부 > Java' 카테고리의 다른 글
7. 이벤트 프로그래밍 (1) (0) | 2020.07.13 |
---|---|
6. 윈도우 프로그래밍 (0) | 2020.07.12 |
4. 클래스와 객체 (0) | 2020.07.10 |
3. 자바 문법 기초2 (0) | 2020.07.09 |
2. 자바 문법 기초 (0) | 2020.07.07 |