객체 지향 프로그래밍과 함수적 프로그래밍을 혼합함으로써 더욱 효율적인 프로그래밍이 가능하도록 개발 언어가 변하고 있다. 자바 8에서도 함수적 프로그래밍을 위해 람다식을 지원하게 되었다. 함수적 프로그래밍 (Functional Programming) 함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다. 람다란 무엇인가? 람다식은 익명 함수(anonymous function)을 생성하기 위한 식이다. → 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. → 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 객체 지향 언어보다는 함수지향 언어에 가깝다. 자바에서 람다식을..
JAVA
객체지향을 공부하였다면 SOILD 원칙은 모두 들어봤을 것이다. 의존성 역전 원칙에 대해 공부하던 중 의존성 역전 원칙이라는 건 알겠는데 왜 의존성 역전 원칙을 지켜야 하며, 코드를 어떻게 설계해야 하는지에 대해 의문이 생겼다. 따라서 먼저 의존성은 무엇이고 의존성 역전은 무엇인가에 대해 조사해보고 해답을 얻어 보고자 한다. 의존성? 객체의 세계에서 협력은 필수적이며, 객체가 협력한다는 것은 객체 간의 의존성이 존재한다는 것이다. 여기서 의존성이란 파라미터나 리턴 값 또는 지역변수 등으로 다른 객체를 참조하는 것이다. 컴파일타임 의존성 코드를 컴파일하는 시점에 결정되는 의존성 인터페이스가 아닌 구체 클래스에 의존하면 컴파일 타임 의존성을 갖게 된다. 결합도가 높으며 변경에 유연하지 못하다. 런타임 의존성..
동작 파라미터화를 사용하면 자주 변경되는 요구사항에 효과적으로 대응할 수 있다. 동작 파라미터화 (behavior parameterization)? 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드를 블록을 의미한다. 동작 파라미터화를 추가하려면 쓸데없는 코드가 늘어나는데, 자바8은 람다로 이 문제를 해결한다. 변화하는 요구사항에 대응하기 변화에 대응하는 코드를 구현하는 것은 어려운 일이다. 농장의 재고목록 애플리케이션에 리스트에서 녹색 사과만 필터링하는 기능을 추가한다고 가정한다. 첫 번째 시도: 녹색 사과 필터링 enum { RED, GREEN } public static List filterGreenApples(List inventory) { List result = new Arra..
컬렉션 프레임워크란 Colleciton: 요소를 수집해서 저장하는 것 프로그램 구현에 필요한 자료구조(Data Structure)를 구현해 놓은 JDK 라이브러리 이다. java.util 패키지에 구현되어 있다. 컬렉션 프레임워크의 주요 인터페이스로는 List, Set, Map, Queue가 있다. 해당 인터페스는 컬렉션을 사용하는 방법을 정의한 것이고, 아래는 이 인터페이스로 사용 가능한 컬렉션 클래스를 나타낸다. List, Set, Queue는 객체를 추가, 삭제, 검색하는 방법에 많은 공통점이 있기 때문에 이 인터페이스의 공통된 메소드들을 모아 Collection 인터페이스로 정의한다. List는 순서를 유지하며 저장하고, 중복 저장이 가능하다는 특징이 있다. Set은 순서를 유지하지 않고 저장하며..
제네릭이란? generic : 일반적인 클래스에서 사용하는 변수의 자료형이 여러개 이며 메소드는 동일한 경우, 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언한다. 컬렉션 프레임워크에서 많이 사용되고 있다. 제네릭은 타입에러의 발생을 방지한다. 런타임에서 타입 에러가 발생하는 것보다 컴파일 시에 미리 타입을 체크하여 에러를 사전에 방지하는 것이 좋다. 그렇다면 왜 굳이 제네릭을 사용해야 할까? 클래스의 멤버를 Object로 선언하여 모든 타입을 담을 수 있게 만들면 되지 않는가? Object는 문제점이 하나 존재한다. 필요에 의해 타입을 변환해줘야 한다는 점이다. 제네릭은 타입 변환을 제거한다. 코드에서 불필요한 타입 변환을 제거하여 프로그램 성능을 향샹 시킨다. ..
ArrayList는 List인터페이스를 구현한 클래스입니다. AbstractList를 상속받고 아래와 같은 필드를 가집니다. public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { @java.io.Serial private static final long serialVersionUID = 8683452581122892189L; private static final int DEFAULT_CAPACITY = 10; // 디폴트 용량 private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Obj..
메소드를 호출할 때 파라미터를 전달하는 방법에는 두 가지가 있다. call by value: 메소드의 파라미터로 값을 넘겨주는 방식이다. call by reference: 메소드의 파라미터로 참조(주소)를 직접 넘겨주는 방식이다. Call by Value Call by Value는 메소드가 파라미터로 받은 값을 복사하여 처리하는 방식이다. 따라서 호출된 메소드 안에서 인자 값이 변경되어도, 호출한 쪽에서는 영향이 없다. 당신은 복사가 되는 마법 사과를 가지고 있다. 당신은 나에게 그 사과를 복사해서 주었다. 나는 그 사과를 맛있게 먹었다. 당신의 사과는? 그대로 일 것이다. 다음과 같은 코드가 있다고 가정해보자. public class CallByValueExample { public static voi..
Object 모든 클래스의 최상위(root) 클래스 모든 클래스는 object 클래스를 상속 받는다. 왜 object 클래스를 상속 받을까? 가장 큰 이유는 Object 클래스에 있는 메소드를 통해서 클래스의 기본적인 행동을 정의할 수 있기 때문이다. 클래스라면 이정도의 메소드는 정의되어 있어야 하고, 처리해 주어야 한다는 것. 그 기본이 Object 이기 때문에 Object를 상속받는다. 이건 무엇을 의미하는가? 모든 클래스는 Object 참조변수로 생성할 수 있다는 뜻! Object (Java SE 20 & JDK 20) java.lang.Object public class Object Class Object is the root of the class hierarchy. Every class has..
바인딩 (binding) 바인딩이란 컴퓨터 프로그램에서 각종 값들이 더 이상 변경되지 않는 값으로 구속 되는 것입니다. 풀어서 설명해보자면, 변수(식별자, identifier)가 각종 타입에 의해 데이터형이 확정되는것, 변수가 메모리 주소를 가리키거나 값을 가지는 것혹은 호출될 함수를 결정하는 것을 바인딩이라고 합니다. 바인딩은 컴파일 시에도 수행되고, 런타임 시에도 수행됩니다. 컴파일 과정에서 수행되는 바인딩을 정적(static) 바인딩이라고 하며, 런타임 과정에서 수행되는 바인딩을 동적(dynamic) 바인딩이라고 합니다. 정확하게는 ‘컴파일이나 런타임 과정에서 결정된다’ 라고 표현하는 게 맞는 것 같습니다. 정적 바인딩 (Static Binding) 컴파일 시에 결정되는 바인딩을 정적 바인딩이라고 ..