본문 바로가기

development/Codestates

23.01.02 bergerQueen만들기-1

오늘은 햄버거 매장 주문 프로그램을 만들어보면서 전에 배웠지만 정리하지 않았던 것들과

한번 더 돌아보게 했던 것들을 정리했다.

 

요구사항 분석

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 하며 성능도 좋다고 한다

-----
다른 사람이 만든 프로그램을 배운지 얼마 안된 언어로 따라가며 작성하다보니 
생소하기도 하고 적응이 안 되는 느낌이다. 내일까지 버거퀸은 끝낼수 있도록 열심히 해야겠다