* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자열을 저장하고, 관리하는 클래스입니다. 굳이 여러가지를 만들어놓은 이유는 무엇일까요. 1) String 먼저 String과 다른 클래스(StringBuffer, StringBuilder)의 차이점은 두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변), StringBuffer는 mutable(변함)에 있습니다. String은 문자열을 대표하는 것으로 문자열을 조작하는 경우 유용하게 사용할 수 있습니다. 문자열, 숫자..
커맨드 패턴 정의 ) 커맨드 패턴을 이용하면 요구사항을 객체로 캡슐화 할수 있으며, 매개변수를 써서 여러가지 다른 요구 사항을 집어 넣을수 있다. 또한, 요청 내역을 큐에 저장하거나 로그를 기록하여, 작업 취소 기능도 넣을수 있다. 커맨트 패턴은 일련의 행동을 특정 리시버 하고 연결 시킴으로써 요구 사항을 캡슐화 시킨다. 요청을 하는 객체와 그 요청을 수행하는 객체를 분리시키고 싶다면 커맨드 패턴을 사용하면 된다. 커맨드 패턴 : 클래스 다이어그램 Remote Control 예제 public class LightOnCommand implements Command { Light light; public LightOnCommand(Light light) { this.light = light; } public..
인스턴스 생성할때 어떻게 할까? --------> new MyClass(); 만약 생성자가 private으로 선언돼있으면? --------> 인스턴스 생성 불가. 생성하게 하려면?? --> 인스턴스변수를 static변수로 미리 선언후 --> 요청시 인스턴스 변수를 만들어서 넘겨주는 식으로 생성해준다. public class Singleton{ private static Singleton uniqueInstance; private Singleton() { } // private로 선언된 생성자 public static Singleton getInstance() { //인스턴스 생성하는 메소드 if (uniqueInstance == null) { //인스턴스가 생성된 적이 있는지 확인후 uniqueInsta..
"new" 는 구상 객체를 뜻한다. 앞에서 배운 것 처럼 구상클래스를 바탕으로 코딩하면 나중에 코드를 수정해야 할 가능성이 높아지고, 유연성이 떨어지게 된다. Duck duck; if( picnic) { duck = new MallardDuck(); } else if( hunting ){ duck = new DecoyDuck(); } else if ( inBathTub){ duck = new RubberDuck(); } 이런 코드는 뭔가를 반영하거나, 확장해야 할때 코드를 다시 확인하고 추가 또는 제거 해야 한다는 것을 뜻한다. 따라서 이런 코드는 관리 및 갱신이 힘들어지고 오류가 생길 가능성이 크다. 애플리케이션에서 구상클래스의 인스턴스를 만드는 부분을 아예 다른쪽으로 분리 시켜야 한다. 앞에서 배웠던..
커피 전문점을 생각해보자. 객체 마을에 스타버즈라는 커피숍이 있다. 커피의 종류는 여러가지에 추가할수 있는 메뉴가 수십가지가 될수도 있다. 다음 그림을 보자. 이렇게 클래스 개수가 엄청나게 늘어난다. 커피 메뉴가 더 늘어나면 훨씬 더 늘어날 것이다. 상속이 강력하긴 하지만, 모든 서브 클래스에서는 똑같은 행동을 상속받게 된다. 이럴때, 구성을 통해서 행동을 확장하게 되면 실행중에 동적으로 행동을 설정할 수있다. (스트레티지 패턴) 디자인 원칙 ) 클래스는 확장에 대해서는 열려있어야 하지만, 코드 변경에 대해서는 닫혀 있어야 한다. O.C.P ( Open-Closed Principle) *무조건 OCP를 적용하는 것은 시간 낭비가 될수도 있다. 코드를 확장해야 할 부분을 선택할때는 세심한 주의를 기울여야 ..