프로그래밍 언어 74

[ Java ] 28. 정적 팩토리 메서드?!

정적 팩토리 메서드 우리가 어떤 인스턴스를 새로 생성할 때는 보통 생성자를 이용한다. 보통 실제 개발에 가면 public 생성자(혹은 빌더패턴)를 주로 이용해서 사용하는데, 이보다 좀 더 나은 방법이 있어서 포스팅한다. public class Product { private String name; public Product(String name) { this.name = name; } public static void main(String[] args) { Product product = new Product("book"); } } 위의 예는 생성자를 이용한 매개변수로 객체를 생성하는 모습이다. 매개변수 하나일 때는 쉽게 예상이 가겠지만 매개변수가 점점 늘어나고 복잡해지면 하지만 개발자가 생성자의 매개변..

[ Java ] 27. Iterable과 Iterator 인터페이스

Iterable vs Iterator 이 주제를 공부하게 된 이유는 Java로 알고리즘을 구현하면서 Iterator를 자주 사용했었는데 문득, Iterable과의 차이에 대해서 알지 못해 이번 기회에 학습하기 위해 기록을 시작한다. 먼저 Collection Framework에 대해서 알아야 하는데 이 컬렉션 프레임워크는 여러 데이터를 효과적으로 처리하기 위한 방법을 제공하는 클래스의 집합이다. 즉, 데이터를 저장하는 자료구조와 그를 처리하는 알고리즘을 구조화해서 클래스로 구현한 것이다. 이 컬렉션 프레임워크는 자바에서 인터페이스(Interface)를 사용해서 구현되고, 컬렉션 프레임워크에서는 다음에 더 자세하게 알아볼 예정이다. Iterable 다시 돌아와서 public interface Collecti..

[ Java ] 26. 얕은복사와 깊은복사

얕은복사와 깊은복사 Java에서 변수를 복사하고자 할 때 일어날 수 있는 두 가지 경우인 Shallow Copy(얕은 복사)와 Deep Copy(깊은 복사)에 대해서 알아보겠다. Shallow Copy는 "주소값"을 복사한다. 이 말은 기존에 참조하고 있던 실제 값은 바뀌지 않고 동일하다는 뜻이다. 즉, 한 쪽 배열에서 수정이 일어나면 나머지 다른쪽 배열에서도 수정이 반영된다. 이에 반해 Deep Copy는 "실제값"을 복사해서 이 값을 새로운 메모리 공간에 복사하게 된다. 즉, 한쪽 배열에서 수정이 일어나더라도 다른쪽 배열에는 아무런 영향을 끼치지 못한다. 코드를 통해서 알아보자. public class Copy { String name; long cnt; public Copy(String name, ..

[ Java ] 25. lambda와 effectively final

lambda 와 effectively final JDK 1.8에서 추가된 람다식에는 규칙이 있다. 람다식은 외부 block에 있는 변수에 접근할 수 있다. 외부에 있는 변수가 지역 변수 일 경우 final 혹은 effectively final인 경우에만 접근할 수 있다. effectively final이란? A non-final local variable or method parameter whose value is never changed after initialization is known as effectively fianl. Java8에 추가된 syntatic sugar의 일종으로, 초기화 된 이후 값이 한번도 변경되지 않았다면 effectively final이라고 할 수 있다. effective..

[ Java ] 24. 익명클래스보다는 람다

익명 클래스보다는 람다 자바에서 함수 타입을 표현할 때는 추상 메서드를 하나만 담은 인터페이스(또는 추상 클래스)를 사용했다. 이러한 인터페이스의 인스턴스를 함수 객체라고 해서 특정 함수나 동작을 나타내는데 썼다. 익명 클래스 JDK 1.1 버전부터 함수 객체를 만들 때 익명 클래스(Anonymous Class)를 주로 사용했다. 하지만 익명 클래스 방식은 코드가 너무 길기 때문에 이 떄까지의 자바는 함수형 프로그래밍에 적합하지 않았다. import java.util.*; public class Main { public static void main(String[] args) { List Words = Arrays.asList("APPLE", "Banana", "orange", "korea"); Coll..

[ Java ] 23. 자바에서의 함수형 프로그래밍

함수형 프로그래밍 프로그래밍의 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 하고 어떻게 코드를 작성할지 결정하게 하기 때문에 큰 역할을 한다고 볼 수 있다. 명령형 프로그래밍 : 무엇(What)을 할 것인지 보다는, 어떻게(How)할 건지 설명 절차적 프로그래밍 (Tow-Down) 단순히 순차적으로 프로그래밍 하는 것이 아니라, 프로시저 콜이라는 함수 호출을 통해 명령을 수행하는 것. (C, C++) 객체지향 프로그래밍 실제 세계를 모델링하여 객체 간의 상호작용을 나타내는 개발 방법(C++, Java, C#) 선언형 프로그래밍 : 어떻게(How)를 나타내기 보다 무엇(What)을 할 건지 설명 함수형 프로그래밍 순수 함수를 조합하고 소프트웨어를 만드는 방식(클로저, 하스켈, 리스프) > 함수형 프로..

[ Java ] 22. 자바의 오류와 예외처리에 대해서

자바의 예외에 대해서 > Java 에서의 3가지 Exception Check Exception Error 에러는 자바 프로그램 밖에서 발생한 예외를 말합니다. 그 예로, 서버의 디스크가 고장났다던지 메인보드가 나가서 자바 프로그램이 동작하지 않는다던지가 이에 속합니다. Exception.class는 에러가 아닙니다. 자바에서 Error로 끝나면 에러이고, Exception으로 끝나면 예외이다. Error와 Exception으로 끝나는 오류의 가장 큰 차이는 프로그램 밖에서 발생했는지(Error), 안에서 발생했는지(Exception)의 여부입니다. 더 큰 차이는 프로그램이 멈추어 버리느냐(Error : 프로세스에 영향), 계속 실행할 수 있느냐의 차이(Exception : 쓰레드에 영향)입니다. Runt..

[ Java ] 21. Optional Class

Optional Class 먼저 Optional Class는 값이 존재하는지 여부를 명시적으로 체크하기 위해서 등장하였다. Optional 클래스는 Integer나 Double 클래스 처럼 T 타입의 객체를 포장해주는 래퍼 클래스(Wrapper Class)이다. 따라서 Optional의 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다. 메소드 실행 시 반환하는 값을 알 수 없을 때 혹은 그 값이 존재하지 않는 경우에 Optional Class는 매우 유용하게 사용될 것이다. 자바에서는 이 컨셉을 특정 값(null을 포함할 수 있는)을 담는 컨테이너 객체를 Optional로 표현했다. Optional의 인스턴스는 불변 인스턴스이며 hashCode, equals, toString 메서드는 인스턴스 상태(..

[ Java ] 20. 일급컬렉션(First Class Collection)

일급컬렉션 First Class Collection Collection을 Wrapping 하면서, 그 외 다른 멤버 변수가 없는 상태 말 그대로, 컬렉션 객체를 Wrapping하는 것을 얘기합니다. public class FirstClassCollection { private Map map; public FirstClassCollection (Map map) { this.map = map; } } 이렇게 Collection울 Wrapping하면서, 그 외 다른 멤버 변수가 없는 상태를 일급 컬렉션이라 합니다. 이러한 작업을 통해 얻을 수 있는 이점이 네 가지 있습니다. 비즈니스에 종속적인 자료구조 Collection의 불변성을 보장 상태와 행위를 한 곳에서 관리 이름이 있는 컬렉션 1. 비즈니스에 종속적..

[ Java ] 19. Java의 접근 제어자

Access Modifier 접근 제어자 변수 또는 메소드의 접근 범위를 설정해주기 위해 사용되는 JAVA의 예약어를 의미하며 총 네가지 종류가 있다. public : 어떤 클래스에서라도 접근이 가능하다. protected : 클래스가 정의되어 있는 해당 패키지 내 그리고 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근이 가능하다. (default) : 클래스가 정의되어 있는 해당 패키지 내에서만 접근이 가능하다. private : 정의된 해당 클래스에서만 접근이 가능하다. final에 대해서도 알아보자 final class : 다른 클래스에서 상속하지 못한다. final method : 다른 메소드에서 오버라이딩 하지 못한다. final variable : 변하지 않는 상수값이 되어 새로 할당할 ..

[ Java ] 18. Overriding vs Overloading

Overriding vs Overloading 둘 다 다형성을 높여주는 개념이고 비슷한 이름이지만, 전혀 다른 개념이라고 봐도 무방할 만큼 차이가 있다. (오버로딩은 다른 시그니쳐를 만든다는 관점에서 다형성으로 보지 않는 의견도 있다.) 공통점으로는 같은 이름의 다른 함수를 호출한다는 것이다. 오버라이딩 상위클래스 혹은 인터페이스에 존재하는 메소드를 하위 클래스에서 필요에 맞게 재정의하는 것을 의미한다. 자바의 경우는 오버라이딩 시 동적바인딩(Dynamic Binding)된다. ex) 아래와 같은경우 SuperClass의 fun이라는 인터페이스를 통해 SubClass의 fun이 실행된다. SuperClass object = new SubClass(); object.fun(); 오버로딩 메소드 이름과 re..

[ Java ] 17. Java Generic

Generic 위로 Generic은 자바에서 안정성을 맡고 있다고 할 수 있다. 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클레스에서 사용하는 것으로, 컴파일 과정에서 타입체크를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다. 자연스럽게 코드도 더 간결해진다. 예를 들면, Collection에 특정 객체만 추가될 수 있도록, 또는 특정한 클래스의 특징을 갖고 있는 경우에만 추가될 수 있도록 하는 것이 제네릭이다. 이로 인한 장점은 Collection 내부에서 들어온 값이 내가 원하는 값인지 별도의 로직 처리를 구현할 필요가 없어진다. 또한, API를 설계하는데 있어서 보다 명확한 의사전달이 가능해진다. 정리를 해보자. Generi..

[ Java ] 16. Java Annotation

Annotation Annoation이란 본래 주석이란 뜻으로, 인터페이스를 기반으로 한 문법이다. 주석과는 그 역할이 다르지만 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있다. 또 해석되는 시점을 정할 수 있다.(Retention Policy) 어노테이션에는 크게 세 가지 종류가 존재한다. built-in annotation : JDK에 내장 되어 있음. 상속받아서 메소드를 오버라이드할 때 나타나는 @Override 어노테이션이 대표적이다. Meta annotation : 어노테이션에 대한 정보를 나타내기 위한 어노테이션 Custom annotation : 개발자가 직접 만든 어노테이션

[ Java ] 15. Java에서의 Stream

Stream JAVA 8 이상부터 Stream API를 지원합니다. JAVA에서도 8버전 이상부터 람다를 사용한 함수형 프로그래밍이 가능해졌습니다. 기존에 존재하던 Collection과 Stream은 무슨 차이가 있을까요? => 바로 데이터 계산 시점 입니다. Collection 모든 값을 메모리에 저장하는 자료구조. 따라서, Collection에 추가하기 전에 미리 계산이 완료되어 있어야 합니다. 외부 반복을 통해 사용자가 직접 반복 작업을 거쳐 요소를 가져올 수 있습니다. (for-each) Stream 요청할 때만 요소를 계산합니다. 내부 반복을 사용하므로 추출 요소만 선언해주면 알아서 반복 처리를 진행한다. 스트림에 요소를 따로 추가 혹은 제거하는 작업은 불가능하다. Collections은 핸드폰..

[ Java ] 14. 프로그램 오류 (Error & Exception)

Error & Exception Error와 Exception의 차이점에 대해 설명하라 어떻게 Exception Handling을 할 것인가 Error와 Exception은 같다고 생각할 수 있지만 사실 큰 차이가 있습니다. Error는 컴파일 시 문법적인 오류와 런타임 시 널포인트 참조와 같은 오류로 프로세스에 심각한 문제를 야기시켜 프로세스를 종료시킬 수 있습니다. Exception은 컴퓨터 시스템의 동작 도중 예기치 않았던 이상 상태가 발생하여 수행중인 프로그램이 영향을 받는 것으로 예를 들면, 연산도중 넘침에 의해 발생한 끼어들기 등이 이에 해당합니다. 프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우를 프로그램 오류라 하고, 프로그램 오류에는 에러(Error)와 ..