본문 바로가기
국비지원/JAVA

[JAVA] 16-2. singleton Design Pattern & final Keyword & 상수(constant) & abstract

by cosmog 2022. 10. 13.
반응형
singleton Design Pattern
  • 클래스를 설계하는 디자인 패턴으로 singleton은 객체를 1개만 생성되도록 설계하는 기법이다.

singleton Design Pattern 사용 예시

 

🔆 singleton class

  • singleton 디자인패턴은 아래와 같은 패턴으로 구성된다.
public class Singleton {

	//디자인패턴 - 클래스를 설계하는 기법
	//싱글톤패턴 - 객체를 1개만 생성되도록 설계하는 기법
	
	// 1. 나 자신의 객체를 멤버변수로 선언하고, 1개로 고정한다.
	// static이 없다면 무한loop에 빠짐 계속 나 자신의 객체를 불러오는 것이므로...
	// static 1번만 하겠다는 의미로 무한loop에 빠지지 않는다.
	private static Singleton instance = new Singleton();
	
	//2. 객체 생성을 못하도록 생성자를 private처리
	private Singleton() {}
	
	//3. s변수(나자신 객체)를 getter로 반환
	// static 키워드를 붙임
	public static Singleton getInstance() {
		return instance;
	}
	
	public String site = "aaa";
}

🔆Main class

  • main에서 객체를 몇번이고 생성해도 singleton class에서 1번만 생성되도록 제한을 걸어놓았기 때문에 실체는 하나로 모두 같다.
public class Main {
	
	public static void main(String[] args) {
		
		//Singleton s = new Singleton();
		Singleton s = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		Singleton s3 = Singleton.getInstance();
		
		System.out.println(s == s2);
		System.out.println(s2 == s3);
		
		/*
		 * singleton 디자인을 통해 클래스 객체를 여러번 생성해도 전부 하나로 실체는 같기 때문에
		 * 각 객체의 site변수를 호출해도 다 똑같다.
		 */
		s.site = "이순신";
		System.out.println(s2.site);
		System.out.println(s3.site);
	}

 

final keyword
  • final는 변경 금지 규제를 걸게 되는 keyword이다.
  • final keyword는 class, method, 변수에 적용된다.
  • final이 붙으면 class는 상속을, method는 재정의를, 변수는 값을 변경할 수 없다. (규제)

🔆 final keyword를 사용한 method 예시

아래와 같이 Parent (부모) Class에서 method02를 final 키워드로 제한했을 경우 

Child(자식) Class에서 오버라이딩을 할 수 없다.

🔆final keyword를 사용한 변수 예시

final keyword를 사용하여 변수를 생성한 경우에는 값을 변경할 수 없기 때문에 초기화를 반드시 해주어야한다.

(초기화는 직접해주거나, 생성자를 통해서..)

 

상수 (constant)
  • 상수 : 절대 바뀌지 않는 고정값.

상수의 이름은 모두 대문자로 작성 하는것이 관례

 

아래와 같이 사용가능하다. 

public class Constant {
	
	public static final double PI = 3.14;
	public static final long EARTH_RADIUS = 6371L;
	public static final int O2 = 32;

}
System.out.println(Constant.PI);
//여태껏 사용해 왔던 Math.PI 또한 상수였던 것이다.
System.out.println(Math.PI);

 

abstract
  • final과 정 반대의 의미 (꼭 ~~ 해라)
  • class와 method에만 적용가능 (변수는 불가능)
  • abstract를 붙이면 추상 class, 추상 method가 된다.

abstract 사용 예시

 

🔆 Store Class(부모)

abstract로 생성한 추상 method들은 부모Class에서는 뼈대만 가지고 있다. (기능은 구현되어있지 않음)

package day16.abs.good;

/* abstract method는 일반 class에 사용불가능 abstract class에만 사용 가능하다. */
public abstract class Store {
	
	/*
	 * 1. method에 abstract를 붙이면 추상 method가 된다. ( {}가 없는 method )
	 * 2. 추상method를 사용하고 싶다면, 추상 class가 되어야 한다.
	 * 
	 */
	
	//추상메서드
	public abstract void apple();
	public abstract void melon();
	public abstract void orange();

	/* 멤버변수, 생성자, 일반메서드 전부 사용가능하다. */

	//멤버변수
	private String name = "호식이네";
	
	//생성자
	public Store() {
		System.out.println("추상클래스 생성자 호출");
	}
	
	//일반method (getter, setter)
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
}

🔆SeoulStore Class(자식)

부모Class에서 뼈대만 구성한 abstract method들은 반드시 자식Class에서 overriding하여 기능을 구현해주어야 한다.

package day16.abs.good;

public class SeoulStore extends Store{

	/*
	 * error 해결방법 
	 * 1. 자식 class를 abstract class로 만들어 준다
	 * 2. method를 오버라이딩 해준다.
	 */
	
	@Override
	public void apple() {
		System.out.println("서울지점 사과는 3000원");
	}

	@Override
	public void melon() {
		System.out.println("서울지점 멜론 50000원");
	}

	@Override
	public void orange() {
		System.out.println("서울지점 오렌지는 5000원");
	}


}

🔆 Main

package day16.abs.good;

public class Main {
	
	public static void main(String[] args) {
		
		/*
		 * 1. 추상 class는 객체 생성이 안된다.
		 * 즉, Store s = new Store(); 안됨.
		 * 반드시 자식으로 구체화 해야한다.
		 */
		
		//아래 모형을 class 추상화 부모 객체에 자식을 받기.
		//Store gangnam = new SeoulStore(); 부모 객체로 받아도 결과는 같다.
		
		SeoulStore gangnam = new SeoulStore();
		//부모 class에서 abstract로 생성된 method, 자식에서 overriding된 기능으로 사용가능.
		gangnam.apple();
		gangnam.melon();
		gangnam.orange();
		
		//상속받은 부모의 method 사용 가능.
		System.out.println(gangnam.getName());
		
		

	}

}

 

<자바에서 abstract의 의미>

1. 사용자 클래스를 정의할 굳이 abstract 클래스로 설계할 필요는없다. 
2. 자바내부의 많은 클래스는 abstrct 클래스로 정의되어있음을 알자.
3. 또한, 자식 클래스로 생성해 부모클래스(추상클래스)에 저장해서 사용가능하다는 점에 익숙해져야 한다.

반응형