-
[JAVA] 상속(추상클래스,인터페이스)기초/JAVA 2017. 1. 19. 17:56
자바의 꽃
상속에 대해서 포스팅 하겠습니다.
상속을 하는 이유는 공통적인 부분을 구현을 한뒤
다음 만드는 클래스들에 적용을 시키기 위함인데요
RPG 케릭터를 예를들어서
케릭터에는 공통적인 체력, 마나, 스텟들이 있고
이 값은 케릭터마다 다른 값을 가지고 있으며
고유의 스킬들을 가질 수 있어요
이떄 공통적인 부분을 먼저 구현을 해놓고
상속을 통해서 구현을 한다면 다음 구현하는 케릭터들은 고유의 값들만
구현을 하면 되는 겁니다!
자바에는 상속을 하는 타입이 2개가 있는데요
하나는 클래스이구요 하나는 인터페이스라는 것이예요
클래스 상속받기
자식클래스 extends 부모클래스이름
상속받은 자식클래스는 부모클래스의 모든것을 사용할 수 있습니다.
부모클래스에서 정의 되어있는 변수, 메소드들을 말이예요!
추상클래스
abstract
객체로 생성할 수 없다.
= 인스턴스화할 수 없다.
클래스는 [틀]이라고 저번포스터에 했던것 같습니다.
이 [틀]이 고장난 클래스예요. new생성자로 생성을 할 수 없어요.
그래서 새로운 [틀]에다가 상속(extends)를 해줘서 사용을 해줘야 합니다.
[생성방법]
public abstract class Test{
~~~
}
[상속방법]
public class Main extends Test{
}
저 에러의 뜻을 해석하자면
Owner_Test클래스는 인스턴스화를 할수없는 클래스라는 에러입니다.
말그대로 추상클래스는 객체를 만들수 없다는 것을 잘알아두셔야합니다!
┌────────────────┐
│ 클래스 상속은 한번만 가능합니다 │
│ 다중상속 X << 꼭 기억하세요 │
└───────────────────┘
super
super메소드는 부모클래스의 있는 변수나 메소드를 사용할 때 쓰는 메소드입니다.
예제가 너무 단정지어져있는데 이 처럼 부모의 생성자를 만들어줄때나
자식클래스와 같은 이름을 가진 부모클래스의 변수, 메소드를 불러올때 super메소드를 사용해서 부모클래스의 있는것을 불러올 수 있습니다.
추상메소드
골격이 없습니다
골격을 추가하는순간 abstract를 지우든가
body를 지우든가 하라네요!
골격{}이 없는 추상메소드는
접근제한자 리턴타입 메소드이름(파라매터);
상속받은 클래스는 반드시 Override해줘야 합니다.
Override = 재정의
Owner_Test클래스에서
TestA메소드와 TestB메소드를 추상메소드로 선언하니깐
상속받은 Member_Test클래스는
추상메소로 정의한 메소드 2개를 Override하라는 에러표시가 뜨네요!
(치기 귀찮으니깐 에러를 더블클릭 해줍니다....)
자동으로 Override할 메소드를 불러와주는 이클립스는 사랑입니다.
┌──────────────────────────────┐
또한 추상메소드는 추상클래스와 인터페이스에서만 선언이 가능합니다.
└─────────────────────────────┘
[생성방법]
추상클래스 처럼 마찬가지로 접근제한자 뒤에 abstract를 붙여주면 됩니다.
public abstract void test(파라매터);
▶다른 메소드들과는 달리 추상메소드는 대괄호{} 골격이 없습니다.
public abstract class OwnerClass{
public abstract void testA();
public abstract void testB(int te, float, st);
}
public class MemberClass extends{
@Overried
public void testA(){
}
@Overried
public void testB(int te, float st){
}
}
인터페이스
상수와 추상메소드만 선언이 가능합니다.
또한 인터페이스는 구현자체가 불가능해서 구현이가능한(추상클래스 X)
클래스에서 implements 해줘야합니다.
상수 : 변경할수 없는 값
▶사용하는 용도로는 그냥 설계자가 유지보수하기 쉽게 하기 위함이라고 생각하시면 되요......
public inteface IfTest1{
public abstract void testA();
}
public inteface IfTest2{
public abstract void testB(int te,float st);
}
public class Main implements IfTest1,IfTest2{
@Override
public void testA(){
}
@Override
public void testB(int te, float st){
}
}
인터페이스는 여러개를 implements해줄수 있습니다.
추상메소드는 항상
인터페이스 같은 경우는 대규모 프로젝트에서 많이 볼 수 있는데 예제에서는 굳이 사용하는 이유를 못느끼실수도 있는데 기능연습이라고 생각하시면서 하시면 될것같습니다.
추상클래스와 인터페이스는
규칙같은것을 만들어 줄 때 사용할 수 있습니다.
데이터 전송 규격을 하는 곳에서
파일을 처리하는 클래스에서는 파일을 읽을 떄 Read()라는 메소드를 사용하고
데이터를 전송하는 클래스에서는 데이터를 읽을때 Road()라는 메소드를 사용하고
또 사용자들의 클래스에서 데이터를 받을때 recive()라는 메소드를 사용한다면
프로젝트를 합치는 설계자는 프로젝트를 합치기 어려울 뿐더러 저같으면 프로젝트를 부시고 싶을겁니다.
이럴 경우 읽는 메소드 자체를 Read() 라고 정의한뒤
각 클래스에서 Read() 메소드를 Override해준다면 프로젝트는 쉽게 합칠수 있겠죠
Q.동물클래스를 추상클래스로 만들고
개, 고양이... 등등 클래스를 동물클래스를 상속받아서 만들고
메인클래스에서 객체를 만들어 보세요
문제에서보면
상속받은 자식클래스는 객체를 생성할떄 부모클래스를 타입으로 사용한 것을 볼수있습니다.
이게 중요한겁니다!!!!
상속받은 자식클래스는 부모클래스를 타입으로 사용함으로써 클래스배열을 만들때 실용적으로 사용할 수 있습니다.
이렇게 클래스 배열로 사용할 떄 유용하답니다.
'기초 > JAVA' 카테고리의 다른 글
Eclipse 단축키 모음 (0) 2017.01.20 [JAVA]오버로딩 오버라이딩 (0) 2017.01.20 [JAVA]접근제한자 (0) 2017.01.19 [JAVA]클래스와 메소드 (0) 2017.01.18 [JAVA] 배열 (0) 2017.01.18