목록CS/Java (9)
GiYeong

팩토리 패턴 객체 생성 처리를 서브 클래스로 분리하여 처리하는 패턴 (캡슐화) 객체를 생성하는 Interface는 미리 정의하고, 인스턴스를 만들 클래스의 결정은 서브 클래스 쪽에서 결정 즉, 여러 개의 서브 클래스를 가진 슈퍼 클래스가 있을 때, Input에 따라 하나의 자식 클래스의 인스턴스를 반환 사용 이유 어떤 클래스가 자신이 생성해야하는 객체의 클래스를 예측할 수 없을 때 생성할 객체를 기술하는 책임을 자신의 서브 클래스가 지정했으면 할 때 객체 생성의 책임을 서브 클래스에 위임시키고, 서브 클래스에 대한 정보를 은직하고자 할 때 장점 클라이언트 코드에서 서브 클래스의 인스턴스화를 제거함으로써 서로 간의 종속성을 낮추고, 결합도를 느슨하게 하며, 확장을 용이하게 함 클라이언트와 구현 객체들 사이..

빌더 패턴 생성과 관련된 디자인 패턴으로, 복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공 생성해야하는 객체가 Optional한 속성을 많이 가질 때 효율적 사용 이유 많은 Optional한 멤버 변수 또는 파라미터, 지속성 없는 상태 값들에 대해 처리해야하는 문제들을 해결 예를 들어 팩토리 패턴이나 추상 팩토리 패턴에서 생성해야하는 클래스에 대한 속성 값이 많을 때 아래와 같은 이슈가 발생한다. 클라이언트 프로그램에서 팩토리 클래스로 많은 파라미터를 넘겨줄 때, 타입, 순서 등에 대한 관리가 어려워져 에러가 발생할 수 있다. 경우에 따라 필요없는 파라미터들에 대해 팩토리 클래스에 일일히 null 값을 넘겨줘야 한다. 생성해야하는 sub..

싱글톤 패턴 객체의 인스턴스가 오직 하나만 생성되는 것을 보장하고, 어디서든 동일한 인스턴스에 접근할 수 있도록 하는 디자인 패턴 디자인 패턴 객체 지향 프로그래밍 설계 중, 자주 발생하는 문제를 해결하기 위해 사용되는 패턴 public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { // 생성자를 외부에서 호출못하도록 private 으로 지정 } public static Singleton getInstance() { return instance; } public void say() { System.out.println("hi, there"); } } 사용 이유 메모리 낭비 방지 : 최초..

스크립트 언어와 컴파일 언어 스크립트 언어(Scripting Language) 소스 코드를 컴파일하지 않고 인터프리터로 소스 코드를 한줄한줄 읽어 바로 실행하는 방식으로 동작하는 언어 인터프리터(Interpreter) 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경 컴파일을 하지 않고 소스 코드를 읽으면서 바로 실행하기 때문에 속도가 느리다. ex) Python 컴파일 언어(Compiled Language) 소스 코드를 컴파일한 수, 기계어를 CPU/Memory를 통해 읽어 실행하는 방식으로 동작하는 언어 규모가 큰 프로그램이라면 컴파일에 시간이 오래 걸릴 수 있지만, 컴파일 후 실행속도는 빠르다. ex) C++, Java Imterpreter Compiler 번역 단위 전체 행(줄) 번역 속도 빠..

강한 결합과 느슨한 결합 강한 결합 객체의 의존 관계에서 강한 결합이란, 어떤 객체가 다른 객체에 강한 의존성을 가지고 있음을 말한다. 객체 간에 강한 결합을 이루고 있으면, 한 클래스가 변경될 경우 연관된 다른 클래스도 변경되어야 하며, 이는 유지보수 측면에서 굉장히 불리한 케이스이다. 느슨한 결합 클래스의 자료구조, 메서드를 추상화 할 수 있는 인터페이스를 사용해서 의존성을 최소화하여 강한 결합을 약화시키고 느슨한 결합을 이루게 할 수 있다. 직렬화와 역직렬화 직렬화 객체를 직렬화하여 전송 가능한 형대로 만드는 것을 의미한다. 즉, 객체들의 데이터를 연속적인 데이터로 변형하여 Stream을 통해 데이터를 읽도록 해준다. 직렬화를 하기 위해서는 Serializable 인터페이스를 구현하여야 한다. pu..

SOLID (객체지향 개발 5대 원리) 1. SRP (단일 책임의 원칙 : Single Responsibility Principle) 하나의 모듈(클래스)은 하나의 기능만 가지며, 모듈이 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다. 2. OCP (개방 폐쇄 원칙 : Open-Cloces Principle) 확장에 대해 열려있고, 수정에 대해서는 닫혀있어야 한다. 즉, 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있어야 하고, 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있어야 한다. 3. ISP (인터페이스 분리 원칙 : Interface Segregation Principle) 클래스는 자신이 사용하지 않는 인터..

인터페이스와 추상 클래스의 차이점 추상클래스 클래스 안에 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우 인터페이스 모든 메서드가 추상 메서드인 경우 추상 클래스 인터페이스 공통점 객체를 생성할 수 없다. 선언부만 있는 멤버는 하위 클래스에서 반드시 구현해야 한다. 차이점 일반 클래스에 추상 메서드가 추가된 형태 모든 메서드가 추상 메서드 일반 변수와 일반 메서드 포함 가능 추상 메서드와 상수만 포함 가능 추상 클래스를 상속받아 기능을 이용하고, 확장시키는 목적 함수의 구현을 강제하여 구현 객체의 같은 동작을 보장하는 목적 단일 상속 (Java는 모호성으로 인해 다중 상속을 지원하니 않음) 여러 개의 인터페이스를 구현 가능 (다중 상속처럼 동작) 클래스와 객체(인스턴스)의 차이 클래스 ..

제네릭(Generic) Java에서 제네릭이란 데이터의 타입을 일반화하는 것을 의미한다. 즉, 클래스나 메서드에서 사용할 내부의 데이터 타입을 컴파일 시에 미리 지정하는 방법이다. 이는 아래의 2가지 장점을 가진다. 1. 클래스나 메서드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다. 2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다. 어노테이션(Annotation) Java 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종으로 @ 기호를 앞에 붙여서 사용한다. 어노테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 JVM에 포함되어 작동한다. 어노테이션의 용도 1. 컴파일러에게 코드 작성 문법 에러 체크하도록 정보를 제공. 2. 소프트웨어 개발 툴이 빌..

JVM (Java Virtual Machine) JVM은 Java 어플리케이션을 클래스 로더(Class Loader)를 통해 읽고, Java API와 함께 실행하는 역할을 한다. Java는 물리적인 Machine과 별개인 가상 Machine을 기반으로 동작하도록 설계되었다. 따라서 Java 바이트코드를 실행하고자 하드웨어에 JVM을 동작시킴으로서 Java 실행코드를 변경하지 않고도 모든 종류의 하드웨어에서 동작이 가능하도록 한 것이다. Java 프로그램의 실행 과정 1. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당받는다. JVM은 할당받은 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 2. Java 컴파일러(javac)가 자바 소스코드(.java)를 읽어 Java ..