Java상속 개념
기존의 클래스를 재사용하여 새로운 클래스를 만들어내는 방법이다.
상위 클래스와 하위 클래스를 나누어서 부모클래스의 요소들을 자식클래스에서 받아서 사용하는 방법입니다.
상위클래스의 접근제한자가 private이면 다른클래스에서 접근을 하지 못한다.
이럴경우에는 getter와 setter를 이용해서 접근해야한다.
getter와 setter의 경우 Eclipse에서는 상단의
source ->Gernerate getter/setter 클릭 후 원하는 코드를 지정하면 등록할 수 있다.
상속의 경우
a <- b 를 상속받는경우, a <-b, b <- c를 상속받는 경우, a <- b , a <-c를 상속받는 경우가 있다.
a <- b 를 상속받는 경우
class a {...}
class b extends a {...}
a 가 b를 상속받은 상태에서 b가 c를 상속받는 경우
class a {}
class b extends a{}
class c extends b{}
a가 b를 상속받고 a가 c를 상속받는 경우
class a{}
class b extends a{}
class c extends a{}
Java의 상속의 경우에는 중복상속이 불가능하여 단일 상속만 가능하다.
상속클래스를 이용하여 마우스를 만든다고 했을 때 기능을 만들어 보겠습니다.
먼저 가장 부모클래스인 Mouse를 생성하여 마우스에 들어가는 기본 구조를 만들어 줍니다
public class Mouse {
void MouseMove() {
}
void Left() {
}
void right() {
}
void middle() {
}
void connectionType() {
}
}
이후 마우스가 우리가 자주 사용하는 휠 마우스를 만든다고 했을 때 이제 그 안에 기능을 넣을 것인데
기능은 그냥 출력형태로 어떤 타입인지만 작성하겠습니다.
public class WheelMouse extends Mouse {
@Override
public void MouseMove() {
// TODO Auto-generated method stub
System.out.println("레이저이동");
}
@Override
public void Left() {
// TODO Auto-generated method stub
System.out.println("왼쪽클릭");
}
@Override
public void middle() {
// TODO Auto-generated method stub
System.out.println("스크롤 휠");
}
@Override
public void right() {
// TODO Auto-generated method stub
System.out.println("오른쪽클릭"); }
@Override
public void connectionType() {
// TODO Auto-generated method stub
System.out.println("무선연결"); }
}
위의 코드처럼 휠 마우스를 만들면 a <-b인 형태가 되는데
애플에서 출시한 매직마우스를 만든다고 생각하고 기능을 같은 방법으로 만들어보겠습니다.
public class WheelMouse extends Mouse {
@Override
public void MouseMove() {
// TODO Auto-generated method stub
System.out.println("레이저이동");
}
@Override
public void Left() {
// TODO Auto-generated method stub
System.out.println("왼쪽클릭");
}
@Override
public void middle() {
// TODO Auto-generated method stub
System.out.println("스크롤 휠");
}
@Override
public void right() {
// TODO Auto-generated method stub
System.out.println("오른쪽클릭"); }
@Override
public void connectionType() {
// TODO Auto-generated method stub
System.out.println("무선연결"); }
}
해당방식으로 만든 경우 a <-c 로 만들어 진 것이기 때문에
위에서 말씀드린 a<-b, a<-c형태로 마우스기능을 만든 것 입니다.
마우스 기능을 만든 후 main클래스에서 마우스의 요소들을 호출하여 Console에 찍어보도록 하겠습니다.
public class CreateMouse {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("매직마우스 구성");
MagicMouse mm = new MagicMouse();
mm.connectionType();
mm.Left();
mm.middle();
mm.right();
mm.MouseMove();
System.out.println();
System.out.println("휠 마우스 구성");
WheelMouse wm = new WheelMouse();
wm.connectionType();
wm.Left();
wm.middle();
wm.right();
wm.MouseMove();
}
}
상속받은 클래스의 호출방법은
클래스타입 변수명 = new 클래스타입();
변수명.클래스변수명(); 으로 하나씩 호출이 가능합니다.
해당방식으로 작성한 경우 코드의 가독성이 좋은 편이며, 자동차나 붕어빵처럼 지정된 틀을 하나씩 만들때에는 좋은 방법으로 보입니다.
또한 기존 마우스에서 마우스의 요소를 하나만 변경하여 새롭게 출시한다고 했을 때 새롭게 클래스를 만들어서 작성을 해주어야 합니다.
이번에는 a<-b, b<-c를 상속받는 예제를 만들어 보겠습니다.
마찬가지로 마우스를 만든다고 생각했을때 기능별로 만들 예정입니다.
마우스를 만들면 우선 마우스라는 것은 이동을 해야 하기때문에
이동 클래스를 만들어 줍니다.
public class MouseMove {
public void laserMouseMove() {
System.out.println("레이저로 이동");
}
public void ballMouseMove() {
System.out.println("마우스볼로 이동");
}
}
그리고 왼쪽 마우스 클릭을 상속받아 만들어 줍니다.
public class Left extends MouseMove {
public void leftClick() {
System.out.println("왼쪽마우스 클릭");
}
public void leftTouch() {
System.out.println("왼쪽마우스 터치");
}
}
오른쪽 마우스 클릭을 왼쪽 마우스 클릭으로 상속받아 만들어 줍니다.
public class Right extends Left {
public void rightClick() {
System.out.println("오른쪽마우스 클릭");
}
public void RightTouch() {
System.out.println("오른쪽마우스 터치");
}
}
그리고 중앙 휠을 오른쪽 마우스에서 상속받아 만들어 줍니다.
public class middle extends Right{
public void scrollWheel() {
System.out.println("스크롤 휠");
}
public void touchWheel() {
System.out.println("터치 휠");
}
public void clickWheel() {
System.out.println("클릭 휠");
}
}
그리고 연결타입을 중앙 휠에서 상속받아 만들어 줍니다.
public class ConnectionType extends middle {
public void wireless() {
System.out.println("Usb,BluetoothType타입");
}
public void cableType() {
System.out.println("cable타입");
}
}
그리고 main메소드에서 가장 마지막에 상속된 연결타입을 통해 마우스를 기능별로 호출해 줍니다.
public class Mouse {
public static void main(String[] args) {
//휠 마우스
System.out.println("휠 마우스 구성");
ConnectionType mouse1 = new ConnectionType();
mouse1.laserMouseMove();
mouse1.leftClick();
mouse1.rightClick();
mouse1.scrollWheel();
mouse1.wireless();
//매직 마우스
System.out.println();
System.out.println("매직 마우스 구성");
ConnectionType mouse2 = new ConnectionType();
mouse2.laserMouseMove();
mouse2.leftTouch();
mouse2.RightTouch();
mouse2.touchWheel();
mouse2.wireless();
}
}
해당 방식의 경우 마우스를 만든다고 했을 때는 비효율적일 수도 있지만
이 방식은 a <- b <- c <- d <- e <- f<- g 이런식으로 꼬리를 물어 상속을 받고 있기 때문에
중간에 g까지의 요소가 필요없고 중간의 c, d e등의 요소들을 꺼내어 쓰는 것을 설계할 때에는 효율적으로 사용할 수 있을 것으로 보입니다.
단점은 계속해서 상속을 받은 것 이기 때문에 f를 호출할 때에는 무조건 a,b,c,d를 호출해야하며 a,b,d만 호출이 필요 할 때 불필요한 메모리를 사용할 것이라는 것입니다.
'Programming > Java' 카테고리의 다른 글
| Java JPanel 이용한 막대차트, 꺾은선그래프, 파이차트 만들기 (0) | 2023.07.13 |
|---|---|
| Java StringTokenizer (0) | 2023.07.07 |
| Java 스트링버퍼(StringBuffer) (0) | 2023.07.07 |
| Java Abstract(추상 클래스), Interface(인터페이스) (0) | 2023.07.07 |
| Java 생성자 목적,특징, 사용법 (0) | 2023.07.05 |