JAVA 09 객체지향 프로그래밍(3)
반응형
추상 클래스_abstract class
추상화 - 클래스 간의 공통점을 찾아내서 공통의 조상을 만드는 작업
추상 클래스 - 미완성 설계도
- 추상 메서드를 포함하는 클래스
- 추상 클래스로 인스턴스는 생성 불가능
- 상속을 통해 자손 클래스에 의해서만 완성
- 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 작성
- 다른 클래스를 작성하는 데 도움을 줄 목적
- 생성자, 멤버변수, 메서드를 가질 수 있음
- 추상 메서드를 구현하기 위해 있는 클래스이므로 final을 사용하면 안 됨
abstract class [클래스이름] {
abstract [리턴타입] [메서드이름]();
}
추상 메서드 - 선언부만 작성하고 실제 내용은 상속받는 클래스에서 구현하도록 비워둔 것
- 몸체는 없고 선언부만 존재
- 상황에 맞게 적절히 구현 (자손마다 다르게 구현될 것으로 예상)
- 추상 메서드가 하나 이상 있으면 반드시 추상 클래스로 선언
추상 클래스를 사용하는 이유
- 강제성 - 자손 클래스에서 추상 메서드를 반드시 구현하도록 강요
틀만 있는 계산서 발행 (추상 클래스)
실제 클래스의 공통된 필드와 메서드의 이름을 통일하기 위해
- 유지 보수
실제 클래스를 작성하는 시간을 절약하기 위해
- 중복 제거
Ch07Abstract.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.test.hello; //abstract - 추상의, 미완성의 public abstract class Ch07Abstract { public int point = 1000; public final int ALL_POINT = 20000; // 상수 // 추상 메서드는 바디부가 없다 // 추상 메서드는 일반 클래스에 사용할 수 없다 // 틀을 제공 -> 코드의 효율적 관리 가능 public abstract void myPrint(); public boolean userCheck(int ssn) { //10000 line... return true; } public static void main(String[] args) { } } | cs |
Ch07AbstractChild.java
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 | //추상 부모 클래스를 추상 자식 클래스가 상속하는 이유 //메서드 세분화 public abstract class Ch07AbstractChild extends Ch07Abstract { int point = 1010; public Ch07AbstractChild() { //추상클래스는 생성자를 제공한다. super(); //new Ch07Abstract(); //error } //추상 메서드 public abstract void childAbsFunc(); //추상 클래스를 상속받은 클래스는 추상 메서드를 반드시 구현해야 함 //강제성 //자식 클래스도 추상 클래스면 강제성이 사라짐 public void myPrint() { System.out.println("추상 메서드 오버라이딩"); System.out.println(super.point); // 1000 System.out.println(point); } public static void main(String[] args) { // 추상클래스는 인스턴스화(new) 못함 // Ch07Abstract ab = new Ch07Abstract(); //error //Ch07AbstractChild cac = new Ch07AbstractChild(); //cac.myPrint(); } } | cs |
인터페이스_interface
일종의 추상 클래스
그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움 줄 목적
인터페이스의 메서드는 무조건 바디부가 없음.
- 나중에 구현할 목적
기능 단위로 세분화
- 대표적 규제
- 기본 설계도
- 파라미터가 몇 개 인지, 어떤 메소드를 어떤 타입으로 할지 미리 약속
- 다중 상속
구현_implements
1 2 3 4 | public Interface [인터페이스이름] { (public static final) [타입] [상수이름] = [값]; (public abstract) [메서드이름]([파라미터]); } | cs |
- 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다
- 메서드를 사용(호출)하는 쪽(User)에서는 사용하려는 메서드(Provider)의 선언부만 알면 된다.
- 내용(바디부)은 몰라도 됨
<장점>
- 개발 시간 단축
- 메서드의 내용에 관계없이 선언부만 알면 되기 때문
- 표준화 가능
- 기본 틀을 언터페이스로 작성 → 인터페이스 구현
- 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다
- 상속관계 또는 같은 조상클래스를 보유하지 않은 클래스들에게 인터페이스를 공통적으로 구현하도록 하여 관계를 맺어 줄 수 있다
- 독립적인 프로그래밍 가능
- 클래스의 선언과 구현을 분리시킬 수 있어서 실제구현에 독립적으로 작성 가능
Ch07Inter.java
1 2 3 4 5 6 7 | public interface Ch07Inter extends Ch07InterParent1{ int NUM = 20; //인터페이스에서 변수 이름 무조건 대문자 //public static final이 자동으로 붙으니까 void interMethod(int a); //무조건 public abstract가 생략되어 앞에 붙음 // void myPrint2(){}; // error } | cs |
Ch07Face.java
1 2 3 4 5 6 7 8 9 10 | public class Ch07Face extends Ch07InterClass implements Ch07Inter{ @Override public void parent1Method() { } @Override public void interMethod(int a) { System.out.println(a); } } | cs |
Ch07InterClass.java
1 2 3 4 5 | public class Ch07InterClass { public void myClassPrint(int a) { System.out.println(a+"bc"); } } | cs |
Ch07InterParent1.java
1 2 3 | public interface Ch07InterParent1 { void parent1Method(); } | cs |
Ch07InterParent2.java
1 2 3 | public interface Ch07InterParent2 { void parent2Method(); } | cs |
반응형
'development' 카테고리의 다른 글
SQL 02 조건문/조인/그룹함수 (0) | 2017.12.27 |
---|---|
SQL 01 기초 (0) | 2017.12.27 |
JAVA 08 객체지향 프로그래밍(2) (0) | 2017.12.27 |
JAVA 07 객체지향 프로그래밍(1) (0) | 2017.12.27 |
JAVA 06 배열/스트링/콜렉션 (0) | 2017.12.27 |
댓글
이 글 공유하기
다른 글
-
SQL 02 조건문/조인/그룹함수
SQL 02 조건문/조인/그룹함수
2017.12.27 -
SQL 01 기초
SQL 01 기초
2017.12.27 -
JAVA 08 객체지향 프로그래밍(2)
JAVA 08 객체지향 프로그래밍(2)
2017.12.27 -
JAVA 07 객체지향 프로그래밍(1)
JAVA 07 객체지향 프로그래밍(1)
2017.12.27