반응형
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. 또한, 자식 클래스로 생성해 부모클래스(추상클래스)에 저장해서 사용가능하다는 점에 익숙해져야 한다.
반응형
'국비지원 > JAVA' 카테고리의 다른 글
| [JAVA] 18. 예외처리문법 (try-catch 와 try-catch-finally / throws 와 throw keyword) (0) | 2022.10.17 |
|---|---|
| [JAVA] 17. 인터페이스(Interface) (0) | 2022.10.14 |
| [JAVA] 16-1. 정적제한자 static (0) | 2022.10.13 |
| [JAVA] 15. 다형성 (0) | 2022.10.12 |
| [JAVA] 14-2. 접근제어자 & 객체와 배열 (0) | 2022.10.11 |