백앤드 개발/Java & Spring

[Java] Java 객체 지향2

원채원 2023. 10. 18. 16:16

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) 스프링에서는 인터페이스를 이용해 공통된 기능목록을 제공