반응형
추상 클래스(Abstract Class)
1. 클래스를 정의할 때 이 클래스는 어떻게 구현되어야 하는가에 대한 정의이다.
2. 이 추상 클래스는 일반 메소드 및 추상 메소드를 포함한다.
3. 추상 클래스는 인스턴스화 될 수 없고,
인스턴스를 만들고 싶다면 해당 클래스를 상속받는 서브 클래스를 만들어 인스턴스화 해야 한다.
즉, 추상 클래스 AA가 있는데 AA abc = new AA();로 객체를 생성(인스턴스화)할 수 없고,
또다른 클래스 BB를 만들어 이 BB클래스가 AA클래스를 상속받도록하여 AA 추상 메소드를 작성하여
BB abc = new BB();로 선언해야 한다.
추상 클래스(Abstract Class) 생성 방식
추상 클래스를 생성하는 방식은 다음과 같다.
abstract class 클래스명{ ~ }
이때, 클래스 내부에는 일반 변수, 메소드, 추상 메소드가 들어 갈 수 있다.
이후 '어떤 클래스'가 추상 클래스를 상속하게 된다면,
그 '어떤 클래스'는 반드시 추상 메소드의 속을 채워 넣어야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | abstract class animal{ public int leg; public void run() { System.out.println("달린다"); } abstract public void eat(); } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
< 서브 클래스에서 추상 메소드를 상속할 때 >
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 29 30 31 32 33 34 35 36 | package JavaBasic; abstract class animal{ public int leg; public void run() { System.out.println("달린다"); } abstract public void eat(); } class dog extends animal{ public void eat() { System.out.println("추상 메소드의 속을 채우자 :: 냠냠냠"); } } public class Jmain{ public static void main(String []args) { dog dg = new dog(); dg.eat(); dg.leg = 4; dg.run(); System.out.println("강아지의 다리 수 :: " + dg.leg); } } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
< dog 클래스에 추상 메소드인 eat 메소드를 지운다면 >
위의 오류에서 해결책으로 나온 의미는
아직 만들어지지 않은 메소드가 있는것 같은데?? 추상 클래스를 상속 받았으면 eat() 메소드를 만들어야 되지 않을까?
라고 하는 것이다.
인터페이스(Interface)
추상 클래스와의 공통점
1. 이 클래스는 어떻게 무엇을 구현해야 하는가에 대한 이정표를 알려준다.
2. 직접 인스턴스를 생성할 수 없다.( new를 통한 객체 생성 불가 )
인스턴스를 만들고 싶다면 해당 클래스를 상속받는 서브 클래스를 만들어 인스턴스화 해야 한다.
3. 필드, 추상 메소드를 가질 수 있다.
추상 클래스와의 차이점
1. 추상 클래스와 달리 일반 메소드, 생성자를 가질 수 없다.
2. 필드도 만들기 위해서는 static final을 붙인 상수화한 필드만 사용할 수 있고, 반드시 초기화 해야한다.
3. 일반 메소드가 없다는 의미는 즉, 서브 클래스에서 인터페이스내에 있던 메소드는 모두 구현해야 한다.
4. 인터페이스는 다중 상속이 가능하다. (추상 클래스 및 일반 클래스는 단일 상속만 허용)
인터페이스(Interface) 생성 방식
인터페이스를 생성하는 방식은 다음과 같다.
interface 인터페이스명{ ~ }
1 2 3 4 5 6 7 8 9 10 11 | interface animal1{ final static int leg = 4; public void eat(); abstract void shout(); } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crcous |
이때, 클래스 내부에는 일반 변수, 일반 메소드, 추상 메소드가 들어 갈 수 있다.
일반 메소드, 추상 메소드는 같은 역할을 하며, 서브 클래스에서 모두 작성해 주어야한다.
그리고 필드(일반 변수)는 반드시 초기화를 해주어야 한다.
이후 '어떤 클래스'가 추상 클래스를 상속하게 된다면,
그 '어떤 클래스'는 반드시 추상 메소드의 속을 채워 넣어야한다.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | package JavaBasic; interface animal1{ final static int leg = 4; public void eat(); abstract void shout(); } interface animal2{ final static int eye = 2; public void sleep(); } class dog implements animal1,animal2{ public void eat() { System.out.println("animal1 에 있던 메소드 :: 냠냠냠"); } public void shout() { System.out.println("animal1 에 있던 메소드 :: 왈왈왈"); } public void sleep() { System.out.println("animal2 에 있던 메소드 :: 쿨쿨쿨"); } } public class Jmain{ public static void main(String []args) { dog dg = new dog(); dg.eat(); dg.shout(); dg.sleep(); System.out.println("강아지의 다리 수 :: " + dg.leg); } } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
위의 코드에서 확인할 수 있는 내용
1. dog가 implements를 통해 2개를 상속(다중 상속)받고있다.
2. 인터페이스에 있던 모든 메소드를 dog 클래스에서 작성해주었다.
3. final static int leg = 4로 초기화 되어있고 final이기에 수정 할 수 없을 것이다.
※ final static int eye를 2에서 1로 수정해볼 수 있을까?
해석 :: final 필드이기에 절대 수정안됩니다.
※ 인터페이스에 있는 메소드를 dog 클래스에서 하나 빼면 어떻게 될까?
해석 :: 너 eat이랑 shout 메소드는 잘 넣었는데 sleep 메소드가 빠진것 같아 sleep 메소드를 만들어야 되지 않을까?
반응형
'Basic > Java' 카테고리의 다른 글
Java에서의 정렬 방법 (0) | 2019.01.07 |
---|---|
Java BigInteger - 큰 수 다루기 (0) | 2017.02.27 |
자바 클래스 상속(Java Class Inheritance) (0) | 2016.12.01 |
Java Thread 기초 예제 코드 (0) | 2016.12.01 |
Math 클래스 개념 및 예제 코드 (0) | 2016.11.30 |