개발/Java
[SOLID] 객체 지향 설계의 5가지 원칙
배경 2000년대 초반 로버트 마틴(Uncle Bob)이 명명한 객체 지향 프로그래밍 및 설계의 5가지 기본 원칙입니다. 유연하고 재사용 가능한 시스템을 만들고자 할 때 이 원칙들을 적용할 수 있습니다. SOLID (객체 지향 설계) - 위키백과, 우리 모두의 백과사전 ko.wikipedia.org 원칙 1. SRP (Single Responsbility Principle, 단일 책임 원칙) 한 클래스는 하나의 책임만 가져야 한다는 원칙입니다. 쉽게 풀어 설명하면 요구사항이 변경에 따라 영향받는 요소가 한 가지여야 한다는 것입니다. 책임의 범위는 상황에 따라 다르거나 모호할 수 있지만 한 클래스의 변경에 대한 영향력이 적어야 한다는 의미입니다. Controller -> Service -> Reposito..
[Java] Functional Interface와 익명 클래스
자바에서는 default, static 메소드를 제외한 단 하나의 추상 메소드만 가진 인터페이스를 Functional Interface라고 합니다. interface 선언부 상단에 @FunctionalInterface라는 Annotation을 붙일 수 있습니다. (Java 8 이상) 또 Functional Interface에 있는 추상 메소드를 함수라고 부릅니다 ! Functional Interface @FunctionalInterface interface MyExample { void exam1(); default void exam2() {}// 상관 없습니다. static void exam3() {}// 상관 없습니다. } 익명 클래스 우리가 처음 인터페이스를 배울 때 문법으로는 인터페이스의 인스턴스..
[Java] Default Method
자바의 인터페이스를 통해서 구현을 강제하고 다형성을 제공하며 결합도를 절감시키는 효과를 얻을 수 있습니다. Java 8 이전에는 이런 특징 때문에 필요한 부분만 재정의하고 재사용하기 위해서는 Adapter라는 개념을 구현하여 사용했습니다. interface MyExample { void exam1(); void exam2(); } class MyAdapter implements MyExample { @Override public void exam1() { // 재정의 할 부분 } @Override public void exam2() { // 재정의 하고 싶지 않은 부분 } } class Body extends MyAdapter { @Override public void exam1() { // ...구현부..
[Java] JVM? JRE? JDK?
JVM (Java Virtual Machine) 운영체제에 종속받지 않고 실행하기 위한 프로그램이라고 보면 됩니다. 여러 운영체제에서 기계어로 컴파일하지 않고 컴파일러를 통해 JVM이 읽을 수 있는 바이트 코드(.class)로 변환합니다. 그 후 JVM이 운영체제에 맞는 기계어로 번역해줍니다. 때문에 운영체제에 상관없이 JVM만 있다면 프로그램을 실행할 수 있는 것입니다. JRE (Java Runtime Environment) 컴파일 된 Java 프로그램을 실행하기 위한 환경 입니다. JVM과 실행에 필요한 라이브러리가 포함되어 있습니다. JDK (Java Development Kit) Java 실행 및 개발에 필요한 요소를 갖춘 SDK(Source Development Kit) 입니다. JRE과 Jav..
객체지향 프로그래밍과 설계
객체지향 프로그래밍 (OOP) 등장 배경: 프로그램이 점차 거대해지면서 등장! 프로그램의 동작을 객체 단위로 작게 나누고 합쳐서 하나의 프로그램을 구성하자. 객체 간 협력 관계에 주목 🤩 객체지향의 특성 캡슐화 기능을 수행하는 최소 단위 정보의 은닉 (접근 지정자) 상속 추상 : 상위, 부모, super, 일반화 구체 : 하위, 자식, (this), 구체화 공통된 기능을 여러 객체에게 전달하고 싶을 때 (일반화)할 때 오류에 빠지지 않도록 조심 객체 간 관계와 의미를 잘 파악할 필요가 있음! 추상화 추상 객체 ↔ 구체 객체(구현체) (= 부모 ↔ 자식 = 상위 ↔ 하위 = 일반화 ↔ 구체화) 의미적 추상체 / 추상 기능을 가진 객체(abstract) / 객체 자체가 추상적 (interface) 다형성 추..
[Java] String, StringBuilder, StringBuffer
Java에서 문자열을 다루는 클래스는 String, StringBuilder, StringBuffer 가 있습니다. 적은 양의 연산을 수행할 때는 보통 String 클래스를 사용합니다. 그러나 연산량이 많아질 경우에는 어떤 문제가 발생하는지를 알아보며 StringBuilder와 StringBuffer를 왜 사용하는지 이해해봅시다. 상수 풀 (Constant Pool) Java에서 String은 불변성이라는 독특한 특성을 갖고 있습니다. 문자열 리터럴을 선언할 때 JVM은 Heap 공간 안의 String Pool에 오브젝트를 생성하고 그에 대한 참조를 스택에 저장합니다. 그리고 동일한 문자열에 대해서는 이미 String Pool에 존재하는 오브젝트를 참조하도록 하는 것이죠. 이렇게 되면 메모리 효율성을 극..