Stream은 Java8에서 처음 도입 되었으며, stream은 연속된 데이터들을 처리할 수 있는 기능의 모음이다. stream 작업은 아래 그림과 같이 stream 파이프라인(pipeline)으로 구성되는데 1개의 소스(Array, Collection 등)과 0개이상의 중간 작업과 마지막 1개의 종료 작업으로 끝이 난다. Strem 특징 1. 스트림 소스 생성 종료 작업은 1개만, 중간연산은 여러개 가능하다. 스트림 소스 생성과 종료 작업은 1개만 있을수 있어서 중간 작업과 같이 여러개 있을 수 없다. 만약 한개의 스트림 파이프라인에서 종료 작업을 여러번 하면 에러가 난다. 그리고 중간 작업을 여러번 한다고 해서 원본 소스 데이터를 변경하지 않는다. 2. 지연 연산(LAZY Evaluation) 또한 ..
제네릭스 사용 이유 제네릭스를 알려면 우선 타입변수를 알아야 한다. 타입변수는 일반적으로 제네릭스를 사용하는 ArrayList, Set 등 컬렉션에서 볼 수 있는데, 아래 보이는 가 타입 변수다. 제네릭스를 사용하지 않으면 모든 형태의 데이터를 담을수 있게 Object로 되어 있어야 하고 데이터를 사용하려면 Object의 데이터를 꺼내서 형변환이 필요하고, 또 다른 타입의 데이터를 넣었을때 형변환해서 사용하기 전까지 알수가 없다. List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); 하지만 제네릭스를 사용하면 형변환 할필요가 없고, 데이터를 add 하는 시점에서 데이터 타입이 String이 아니라면 에러가 난다. ..
스프링을 이해하는데 POJO(Plain Old Java Object)를 기반으로 스프링 삼격형이라는 애칭을 가진 IoC/DI, AOP, PSA라고 하는 스프링 3대 프로그래밍 모델에 대한 이해가 필수다. IoC/DI 이해와 전략 패턴 IoC(Inversion of Control)는 제어의 역전 DI(Dependency Injection) 의존성 주입 이라고 한다. 의존 관계라는 것은 프로그래밍에서 new 객체 생성을 뜻한다. 아래 소스를 보면 Car 클래스에서 생성자를 통해 tire 객체를 new 로 생성해서 필드에 주입한다. 이 과정에서 Car 클래스는 Tire 클래스에 의존한다 라는 뜻이 된다. public class Car { Tire tire; public Car() { tire = new Kor..
OCP - 개방 폐쇄 원칙 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다. by 로버트 C. 마틴 위 말을 의역하면 "자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다" 이렇게 된다. 말만 들으면 이해하기 어렵지만 이 원칙을 지킨 디자인 패턴중 대표적으로 어댑터 패턴이 있다. 즉 어댑터 패턴을 이해하면 OCP를 이해할 수 있다. 어댑터 패턴(Adapter Pattern) 어댑터를 번역하면 변환기(converter)라고 할 수 있다. 대표적으로 110V 인터페이스를 -> 220V 인터페이스로 변환해준 어댑터를 생각하면 쉽다. 위 처럼 서로 다른 두개의 인터페이스가 연결이 가능하게끔 해주는 것이고, 이것을 프로그래밍화 ..
SOLID 원칙 객체지향 설계 OOD(Object Oriented Design)의 정수라고 할 수 있는 5원칙이 집대성 됐는데 바로 이것이 SOLID 이다. SOLID는 아래 5가지 원칙의 앞 머리 알파벳을 따서 부르는 이름이다. SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open Closed Principle): 개방 폐쇄 원칙 LSP(Liskov Substitution Principle): 리스코프 치환 원칙 ISP(Interface Segregation Principle): 인터페이스 분리 원칙 DIP(Dependency Inversion Principle): 의존 역전 원칙 위 원칙들은 응집도(High Cohesion)는 높이고, 결합도(Loose ..
함수를 통해서 코드를 논리적인 단위로 나누어 블록화가 가능하여 프로그래밍이 편해지고 더욱 더 파격적으로 객체지향을 위한 클래스가 나왔다. 객체지향은 인간의 인지 및 사고 방식까지 프로그래밍에 접목하는 인간 지향을 실천하고 있다.아래는 객체지향의 4대 특성중 추상화와 상속을 정리한 글이다.추상화추상화는 구체적인 것을 분해해서 관찰자가 관심 영역에 있는 특성만 가지고 재조합 하는것 이다. 이것을 모델링이라고 한다. 모델은 실제 사물을 정확히 복제하는게 아니라 목적에 맞게 관심 있는 특성만을 추출해서 표현하는 것이다. 관심 영역에 있는 특성을 애플리케이션 경계(Application Boundary) 라고 한다. 즉 추상화는 애플리케이션 경계 내에서 관심 있는 특성들만 추출한 클래스이다. 사람이란 클래스를 모델..
자바에서 상속을 이용하면 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과 때문에 유지보수 측면에서 효율성을 높일 수 있다. 그래서 객체지향 프로그래밍 특징 중에 상속이 포함되는 것이다. [상속 특징] 1. 현실에서 상속은 부모가 자식을 선택해서 물려주지만, 프로그램에서는 자식이 부모를 선택한다. 2. 현실에서도 부모를 여러명 가질수 없듯이, 프로그램에서도 단 하나의 부모만 가질 수 있다. 3. 부모 클래스가 private나 다른 패키지에 있고 default 접근 제한자를 가지고 있으면 상속을 할 수 없다. [자식클래스가 부모클래스를 사용할 수 있는 이유] 상속을 받은 자식 클래스의 객체가 생성되면 부모 객체가 먼저 생성되는데 그 이유는 자식 클래스의 기본 생성자에 있는 super() 함수로 부..
[final 필드] final 필드는 초기값이 정해진 이후 수정할수 없는 데이터라는 뜻이다. final 필드에 초기값을 줄 수 있는 방법은 2가지이다. 1. 필드 선언 시에 주는 법 2. 생성자에서 주는 법 만약에 위 2가지 방법으로 초기화를 안하면 아래처럼 에러가 발생한다. [final 클래스] 클래스에 final이 붙으면 상속을 허락하지 않겠다는 의미다. public final class 고양이 { } [final 메서드] 메서드가 final이면 오버라이딩을 금지하게 된다. [상수 설명과 특징] 상수는 한번 정하면 바꿀수 없어서, 불변의 값이라고 한다. 예를들어 원주율 이런것인데 자바에서 상수는 static final 이라고 부른다. 자바에서 final 필드는 한 번 초기화 되면 수정할 수 없는 필드..
싱글톤(Singleton)은 단 하나의 객체만 만들도록 보장하는데 대표적인 디자인 패턴중에 하나이다. 싱글톤을 디자인 패턴을 이해하려면 클래스 정적 멤버와 인스턴스 멤버의 메모리 사용 영역을 이해 해야 한다. [싱글톤 클래스 생성 단계] 1. 싱글톤은 만들려면 우선 외부에서 생성자를 호출 할 수 없어야 한다. 클래스 로더 시점에서 생성자를 통해 자동적으로 객체하나가 생성되고 그 후에는 생성되지 않게 하기 위함이다. 그래서 생성자 앞에 private를 붙여준다. 2. 정적 필드를 만드는데 이것도 다른 클래스에서 사용될수 없도록 private를 붙여주고 클래스로더 시점에 만들어지고 초기화 되어야 하기 때문에 정적 필드 만든다. 3. 마지막으로 만들어진 인스턴스를 가져오는 getInstance() 함수를 만들..
클래스로 부터 객체를 여러개 만들수 있는데 클래스 객체마다 모두 같은 데이터를 가지는 데이터가 있을때 모든 객체마다 해당 데이터를 가질 필요가 없다. 공유되는 해당 데이터를 가지는 필드를 한곳에 위치시키고 객체들이 공유 할 수 있게 하면 좋을 것이다. 자바에서 위 경우를 위해 클래스 멤버를 인스턴스 멤버와, 정적 멤버로 구분해서 선언할 수 있도록 한다. [정적 멤버] 인스턴스 멤버는 객체를 생성하고 그 객체를 참조해야 사용할 수 있지만 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있다. 정적 멤버로 사용하려면 앞에 static을 붙이는데 이때 필드와 메소드 앞에만 붙인다. 왜냐하면 생성자는 객체를 생성하기 위해서 있는 것이기 때문에 무조건 정적 멤버일 수 밖에 없다. 정적 멤버는..
[클래스 도입 이유] 학생1, 2의 데이터를 저장하고 그 데이터를 출력하는 프로그램을 만든다고 생각해보자 첫째로 그냥 변수에 학생 한명에 대한 데이터를 일일히 추가해서 출력하는 방법이 있다. 이 방법의 단점은 학생 한명을 추가할때마다 변수를 또 만들고 출력문도 생성해줘야 하는 번거로움이 있다. public class ClassStart1 { public static void main(String[] args) { String student1Name = "학생1"; int student1Age = 15; int student1Grade = 90; String student2Name = "학생2"; int student2Age = 16; int student2Grade = 80; System.out.prin..
[배열 객체 생성 방법] 배열은 같은 타입의 데이터를 연속된 공간으로 나열하고, 각 데이터에 인덱스를 부여해 놓은 자료구조 이다. 배열 생성할때 값을 초기화 할수 있는데 첫번째 방식으로 scores1은 new int[] 뒤에 값들이 놓여져 있고 scores2는 값들로만 초기화를 하였고 3번째는 배열 변수를 선언하고 값으로만 초기화 하려고했는데 에러가 발생하였다. scores2가 되는걸로 보아서 아마 컴파일러딴에서 변수 앞에 자료형이 있으면 자동으로 뒤에 new int[] 가 붙게 하는것 같다. 스택에 생성된 scores1의 값은 인덱스를 통해 각 값을 가져올 수 있다. scroes1[2] 은 87를 가져온다. 그럼 어떻게 값을 가 져올 수 있을까? 저장된 메모리 구조를 보면 이해 된다. [인덱스로 데이터..