오늘은 햄버거 매장 주문 프로그램을 만들어보면서 전에 배웠지만 정리하지 않았던 것들과
한번 더 돌아보게 했던 것들을 정리했다.
요구사항 분석
1 - 공통사항 확인후 상위,하위클래스로 분류.
2 - 역할에 따라 클래스 분리
3 - 플로우차트 설계_//주석처리로 수도코드 작성
4 - 역할에 따라 메서드 정의 _//기능 분산
5 - 리펙토링_//기법들은 서적이나 검색으로 공부
-------
디렉터리 구조 정리
패키지
특정 목적을 공유하는 클래스 및 인터페이스를 묶은 것
클래스가 패키지에 포함되어있지 않은 경우, default패키지에 자동으로 포함되게 되는데,
이 경우 다른 클래스에서 import할 수 없다. 따라서 패키지에 정리해줘야 한다.
Main 클래스의 main메서드에 로직 코드를 작성하지 않는 이유
main메서드는 static키워드가 붙어있어서 정적 메서드가 되기 때문.
==인스턴스 변수,필드를 활용할 수 없다
---
getter / setter
private로 멤버변수 설정 후 클래스 외부에서 호출 및 변경을 가능하도록 하는 메서드
사용이유
- 멤버변수의 호출 및 수정의 접근제어자를 다르게 할 때
- 멤버변수 수정시 조건을 추가하고싶을 때
- 저장된 데이터 계산이 필요할 때
getter
클래스 외부에서 멤버변수의 정보를 얻을 때 사용
setter
클래스 외부에서 멤버변수의 값을 세팅할때 사용
설정법
public class Product {
private int price; //private 멤버변수 설정
public Product(int price){ //생성자
this.price = price;
}
public int getPrice() { //getter
return price; //호출이므로 리턴
}
public void setPrice(int price) { //setter
this.price = price; //수정용 this
}
}
final
사용법
final class FinalEx { // 확장/상속 불가능한 클래스
final int x = 1; // 변경되지 않는 상수
final int getNum() { // 오버라이딩 불가한 메서드
final int localVar = x; // 상수
return x;
}
}
instanceof 연산자
Syntax
object instanceOf type
object가 type이거나 type을 상속받는 클래스라면 true리턴
Casting 캐스팅
타입 변환. 상속관계에 있는 클래스는 서로 변환이 가능하다
Upcasting
자식 클래스의 객체를 부모 클래스 타입으로 형 변환. 형 변환 연산자 생략 가능
Vehicle vehicle = (Vehicle) car; // 상위 클래스 Vehicle 타입으로 변환(괄호 생략 가능)
Downcasting
부모 클래스의 객체를 하위 클래스의 타입으로 형 변환
Car car2 = (Car) vehicle; // 하위 클래스 Car타입으로 변환(생략 불가능)
Singleton 패턴
인스턴스를 불필요하게 생성하지 않고 오직 JVM내에서 한 개의 인스턴스만 생성하여 재사용을 위해 사용되는 디자인패턴
사용법
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
-해당 코드는 쓰레드 동시 접근시 문제발생
synchronized 를 이용한 Singleton 패턴
멀티스레드 환경에서도 문제없는 싱글톤 패턴
public class Singleton {
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
synchronized
대상 메소드를 호출~종료까지 단일 쓰레드만 사용하고 다른 쓰레드가 접근하지 못하도록 lock
volatile
사용시 instance는 CPU캐시에서 변수를 참조하지 않고 메인 메모리에서 참조
LazyHolder Singleton 패턴
public class Singleton {
private Singleton(){}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
객체가 필요한 시점까지 초기화를 지연시킴. static영역에 초기화
volatile, synchronized키워드없이 사용할 수 있고
thread-safe 하며 성능도 좋다고 한다
-----
다른 사람이 만든 프로그램을 배운지 얼마 안된 언어로 따라가며 작성하다보니
생소하기도 하고 적응이 안 되는 느낌이다. 내일까지 버거퀸은 끝낼수 있도록 열심히 해야겠다
'development > Codestates' 카테고리의 다른 글
코드스테이츠 벡엔드 43기 Section 1 회고 (0) | 2023.01.11 |
---|---|
23.01.03 burgerQueen만들기-2 (2) | 2023.01.04 |
22.12.30 22.12.29 객체지향 프로그래밍 심화-2 (0) | 2022.12.31 |
22.12.29 객체지향 프로그래밍 심화-1 (2) | 2022.12.29 |
22.12.28 블로그 세션, 객체지향 프로그래밍 기초-2 (0) | 2022.12.28 |