[Java] Java 객체 지향2
1. 상속
상위 클래스의 기능을 extends 키워드로 하위 클래스에서 사용 또는 재정의
상위 클래스에서 공통적인 기능을 정의하고 자식 클래스에서 사용 또는 재정의
이미 마련되어 있는 클래스를 재사용하기 떄문에 효율적
private 필드/메서드는 상속 받을 수 없음
다른 패키지의 default 필드/메서드도 상속 받을 수 없음
ERP의 경우 기능개발자가 부모 클래스 형태로 제공하면 파트별로 개발자가 이를 상속받아 구현
package lec09;
// 콜라 부모 클래스
public class Cola {
public String colaName = String.valueOf("콜라");
public void showColaProperty() {
System.out.println("음료 종류는 탄산");
}
public void showColaName(String getColaName) {
colaName = String.valueOf(getColaName);
System.out.println("콜라 이름 ::: " + colaName);
}
}
package lec09;
public class PepsiCola extends Cola{
@Override
public void showColaProperty() {
super.showColaProperty();
}
@Override
public void showColaName(String getColaName) {
super.showColaName(getColaName);
}
public void whereIsPepsiCola() {
System.out.println("미국 뉴욕");
}
}
2. 인터페이스
클래스에 기능 목록을 제공
객체-인터페이스 간의 상속 관계를 통해 핵심적인 설계를 형성
표준화된 관리타입을 위해, 매서드를 관리하기 위해 사용되며 이는 다형성과도 연결
implements 키워드로 재정의 (오류 클릭 > add unimplement methods)
추상 메서드와 상수만을 포함하며 매서드는 반드시 재정의 해야함
implement 키워드와 콤마를 이용해 다중 구현이 가능
구현한 클래스를 상속 받아 재정의할 수도 있음
package lec10;
public interface ProgramInterface {
public void start();
public void stop();
public void run();
public void shutdown();
}
package lec11;
// 추상 클래스를 상속 받기 위해 extends 키워드 추가 후, add unemplmented class
public class ExtendsClass extends AbstractClass{
@Override
public void methodFirst() {
// TODO Auto-generated method stub
System.out.println("상속받은 클래스의 오버라이딩된 methodFirst");
}
@Override
public void methodSecond() {
System.out.println("상속받은 클래스에서 로직이 더 들어갑니다");
// TODO Auto-generated method stub
super.methodSecond();
}
@Override
public int methodThirds() {
int getData = super.methodThirds();
int addMoreData = 12;
return getData + addMoreData;
}
}
3. 추상 클래스
상속과 인터페이스를 모두 사용
인터페이스의 기능목록(추상 메서드) 와 상속의 공통 기능을 제공
상위 클래스의 기능을 extends 키워드로 하위 클래스에서 사용 또는 재정의
인터페이스와는 다르게 간단한 로직을 들고 있을 수 있다.
package lec11;
// 추상클래스: 구체적인 기능이 정의되지 않은 추상 메소드
// 보통 복잡한 메서드를 지원하지 않음. 간단한 로직과 공통된 로직을 구현.
// abstract 를 앞에 붙여 정의
public abstract class AbstractClass {
public abstract void methodFirst();
public void methodSecond() {
System.out.println("추상클래스 methodSecond");
methodFirst();
}
public int methodThirds() {
return 10 + 2;
}
}
package lec11;
// 추상 클래스를 상속 받기 위해 extends 키워드 추가 후, add unemplmented class
public class ExtendsClass extends AbstractClass{
@Override
public void methodFirst() {
// TODO Auto-generated method stub
System.out.println("상속받은 클래스의 오버라이딩된 methodFirst");
}
@Override
public void methodSecond() {
System.out.println("상속받은 클래스에서 로직이 더 들어갑니다");
// TODO Auto-generated method stub
super.methodSecond();
}
@Override
public int methodThirds() {
int getData = super.methodThirds();
int addMoreData = 12;
return getData + addMoreData;
}
}
4. 익명 클래스
객체 생성 후 바로 사용
스프링보단 모바일 단에서 많이 사용
package lec12;
// 익명클래스: 객체 생성 후 바로 사용
public class UnanyClassMainMethod {
public static void main(String[] args) {
// Runnable(): 일종의 쓰레드 관련 클래스
// new Runnable ctrl+space
Runnable action = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Runnalbe 구동 중");
}
};
action.run();
}
}
5. 내부 클래스
클래스 내부에 클래스 정의
선언된 곳 외에는 잘 사용되지 않아야 함
거의 안쓰임
package lec12;
// 내부 클래스
public class InnerClassMake {
public void outMainMethod1() {
System.out.println("외부 클래스의 메소드 1");
}
class SampleInnerClass{
public void inMethod1() {
System.out.println("내부 클래스 메소드1");
}
}
}
package lec12;
// 내부 메서드 출력
public class InnerClassMainMethod {
public static void main(String[] args) {
InnerClassMake innerClassMake =new InnerClassMake();
InnerClassMake.SampleInnerClass sampleInnerClass = innerClassMake.new SampleInnerClass();
innerClassMake.outMainMethod1();
sampleInnerClass.inMethod1();
// "외부 클래스의 메소드 1" 출력
// "내부 클래스 메소드1" 출력
}
}
6. 기타 코멘트
1) ERP: 전사적 자원관리. 모든 부서의 수입과 비용 등을 계산하는 프로그램
ERP 개발의 경우 규모가 커질수록 복잡도를 줄이기 위해 유사 기능을 한 곳에서 관리
업무에 해당하는 부모 클래스 형태의 기능이 개발되면
파트별로 이를 상속받고 부서에 해당하는 DB 데이터를 끌고와 적용하는 식으로 개발함
2) PL(PM 관리) - PM(개발자 관리) - 개발자(기능 구현)
3) 스프링에서는 인터페이스를 이용해 공통된 기능목록을 제공