목록전체 글 (67)
devseop08 님의 블로그
한 번 생성된 객체의 상태(필드 값)가 절대 변하지 않는 클래스를 의미즉, 생성 시점에 정의된 값이 프로그램 종료까지 절대 변경되지 않음을 보장불변 클래스 특징장점스레드 안정성(Thread-Safety): 상태가 변하지 않으므로 여러 스레드가 동시에 접근해도 동기화 불필요 안정성 & 단순성: 외부 코드에서 객체 내부 상태를 바꿀 수 없으므로 예측 가능한 동작 보장함수형 프로그래밍 스타일과 궁합: 데이터가 변경 불가능하기 때문에 변경 대신 새 객체를 생성 -> side effect 최소화다른 클래스에서의 방어적 복사 불필요Hash 기반 컬렉션에 적합: HashMap, HashSet 등에서 key로 사용 시 값이 변하지 않으므로 안전.단점객체가 갖는 값마다 매번 새로운 객체가 필요하기 때문에 메모리 누수와 ..
Object루트 클래스: 자바의 모든 클래스는 암묵적으로 Object 클래스를 상속한다.class A {}는 class A extends Object {}와 동일하다.주요 메서드와 기능: 기본적으로 객체의 동일성, 동기화/통신(wait/notify), 복제, 런타임 타입 정보 등을 제공하는 메서드를 정의한다.메서드설명비고 / 주의equals(Object o)객체의 논리적 동등성을 비교. 기본 구현은 참조(identity) 비교 (==).재정의 시 hashCode()도 반드시 함께 재정의해야 한다.hashCode()객체를 해시 테이블에 넣을 때 사용하는 정수 값. equals와의 계약이 있음.equals가 같다면 hashCode도 같아야 한다.toString()객체를 사람이 읽을 수 있는 문자열로 표현. ..
상속의 목적은 코드 재사용이 아닌, 타입 계층을 구조화하기 위함이다.타입 계층은 다형성의 기반을 제공한다.상속을 단순히 코드를 재사용하기 위한 목적으로 사용하는 것인지, 클라이언트 관점에서 인스턴스들을 동일하게 행동하는 그룹으로 묶기 위한 목적으로 사용하는 것인지 분명하게 구별해야 한다.다형성이 런타임에 메시지를 처리하기에 적절한 메서드를 동적으로 탐색하는 과정을 통해 구현된다는 사실과상속이 이러한 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하는 방법임을 이해해야 한다.1. 다형성다형성의 분류오버로딩 다형성: 하나의 클래스 안에 동일한 이름의 메서드가 존재하는 경우강제 다형성: 동일한 연산자를 다양한 타입에 사용할 수 있는 방식이다.ex) 자바의 이항 연산자 +매개변수 다형성: 제네..
표준 템플릿 라이브러리, STL은 C++ 언어가 제공하는 템플릿을 바탕으로 만든 컨테이너 클래스를 제공하는 라이브러리이다. 템플릿을 사용해 구현된 컨테이너들의 집합이다.벡터, 리스트, 큐 그리고 스택 등의 클래스 템플릿과 그 안에 저장된 데이터를 검색하고 정렬하는 등의 처리를 위한 함수들이 제공된다.STL의 목적은 프로그래머들이 많이 사용하는 공통적인 컨테이너 클래스를 제공하는 것이다.STL의 구성요소컨테이너: 객체 또는 기본 데이터 타입의 집합으로 각 컨테이너는 관련된 헤더 파일 포함 필요반복자: 컨테이너 요소들에 대한 순회 및 접근알고리즘: 컨테이너의 요소들을 다루기 위한 알고리즘(find, max, count, accumulate, sort, ...)컨테이너컨테이너는 데이터를 저장하는 것으로, 저장..
Generic Programming(일반화 프로그래밍)과 템플릿제네릭 프로그래밍이란 ? : 타입에 관계없이 동작하는 일반적인 코드를 작성하는 방법예를 들어, 여러 가지 덧셈을 수행하는 함수를 정의할 때, 기존에는 덧셈에 사용되는 인자들의 타입에 따라 개별적으로 함수들을 구현해야 했다.add(int i1, int i2), add(double d1, double d2), add(Point p1, Point p2)이를 하나의 함수로 구현할 수 있게 하는 기법이 제네릭 프로그래밍 기법이다.제네릭 프로그래밍의 구현 방법매크로 사용함수/ 클래스 템플릿 사용매크로를 사용한 제네릭 프로그래밍매크로(#define) : 코드의 단순 대체#include #define MAX(a, b) ((a>b)?a:b)int main(..
자바 1.0에서는 java.util.Date 클래스 하나로 날짜와 시간 관련 기능을 제공Date 클래스의 문제1.'Date'라는 클래스 이름과 달리 Date 클래스는 특정 시점을 날짜가 아닌 밀리초 단위로 표현2.1900년을 기준으로 하는 오프셋, 0에서 시작하는 달 인덱스 등 모호한 설계로 인한 유용성하락3.Date 클래스의 toString으로는 반환되는 문자열을 추가로 활용하기 어렵다.(Date는 JVM 기본 시간대인 CET, 즉 중앙 유럽 시간대를 사용했는데 이것이 문자열로 반환된다.)Date 클래스는 자체적으로 시간대 정보를 알고 있지도 못한다.자바 1.1에서는 Date 클래스의 여러 메서드를 deprecated시키고 java.util.Calendar 클래스를 대안으로 제공Calendar 클래스의..
11.1 값이 없는 상황을 어떻게 처리할까?전형적인 문제 상황public class Person { private Car car; public Car getCar(){ return car; }}public class Car { private Insurance insurance; public Insurance getInsurance() { return insurance; }}public class Insurance { private String name; public String getName() { return name; }}public String getCarInsurance(Person person) { return person.getCar().getInsuran..
11.1 타입 인자를 받는 타입 만들기: 제네릭 타입 파라미터제네릭스를 사용하면 타입 파라미터를 받는 타입을 정의할 수 있다.제네릭 타입의 인스턴스가 만들어질 때는 타입 파라미터를 구체적인 타입 인자로 치환한다.구체적인 타입을 타입 인자로 넘기면 타입을 인스턴스화할 수 있다.코틀린 컴파일러는 보통 타입과 마찬가지로 타입 인자도 추론할 수 있다.val authors = listOf("Dmitry", "Svetlana");listOf에 전달된 두 값이 문자열이기 때문에 컴파일러는 여기서 생기는 리스트가 List임을 추론한다.반면에 빈 리스트를 만들어야 한다면 타입 인자를 추론할 근거가 없기 때문에 직접 타입 인자를 명시해야 한다.리스트를 만들 때는 변수의 타입을 지정해도 되고 변수를 만드는 함수의 타입 인자..