private? 사용은 조금 불편하지만 유효성을 체크한다거나 안전하게 코드를 설계하는 것에 꼭 필요하니 친해지자.
싱글톤 패턴? 여러 접근에도 공유 자원을 관리하여 일관성을 유지할 수 있다.
상속 & 추상클래스 & 인터페이스 (for API 활용능력)
상속
A is a B 관계일 때 적용
extends 키워드 사용
부모가 정의한 필드(전변) 메소드를 자손이 언제든 사용 가능(재사용성)
but, 클래스 사이의 결합도 높음 → 추상클래스, 인터페이스 중심 코딩 전개 추천
상속을 받을 때는 상위클래스보다 하위클래스를 상속받는 것이 더 많은 메소드를 호출할 수 있다.
//EMain is a E
class E{
public E() {
System.out.println("E()");
}
public void m() {
}
}
public class EMain extends E {
public EMain() {
System.out.println("EMain()");
}
//부모 메소드 오버라이드 -> 틀을 바꿔서 사용하는 건 안 됨(약속)
@Override //주석이 아님
public void m() {
}
//메소드 오버로딩
public void m(int i) {
}
public static void main(String[] args) {
new EMain(); // 호출하게 될 때 부모인 E의 생성자부터 거쳐서 내려옴 -> 메모리에 부하가 올 수 있음.
}
}
추상클래스 & 인터페이스
설계의 확장(새로운 컨셉의 객체, 서비스를 제공)
결합도 낮아짐, 단위테스트 가능
인터페이스는 일반메소드, 생성자 갖지 못 함/추상클래스는 일반메소드, 생성자 모두 가질 수 있음
but, 인스턴스화 할 수 없음.
/*누가 더 많은 메소드를 구현하나? my = you
왜? 인터페이스의 메소드는 구현체가 없이는 구현이 되지 않음.
my, you 모두 ArrayList 클래스를 사용하여 생성된 객체입니다. 따라서 기본적인 메소드는 동일
누가 더 많은 메소드를 갖고 있나? my > you*/
List <Object> my = new ArrayList<>();
ArrayList<Object> you = new ArrayList<>();
💡 1초에 2000명씩 접속한다면?
인스턴스화를 2000번 진행하여 각각 다르고 다른 값을 가진 객체를 생성함.(VO)
→ private / 캡슐화 / 유효성체크 필요 / 객체 생성을 생성자(new)를 사용하지 않고, static 메소드의 리턴타입을 통해 받아 온다.
(→ thi를 사용하여 원본을 유지함)
- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 패턴!!
- 외부에서 사용하지 못 하도록 생성자를 묶음
- static
- 싱글톤패턴, 인스턴스화 필요 x
- 사용빈도 높지 않지만 웹서비스 구현 시 필요?!