목록Language (49)
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()객체를 사람이 읽을 수 있는 문자열로 표현. ..
표준 템플릿 라이브러리, 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임을 추론한다.반면에 빈 리스트를 만들어야 한다면 타입 인자를 추론할 근거가 없기 때문에 직접 타입 인자를 명시해야 한다.리스트를 만들 때는 변수의 타입을 지정해도 되고 변수를 만드는 함수의 타입 인자..
연산자 다중정의연산자 다중 정의란?C++의 연산자들은 C++에서 제공되는 기본 자료형에 대해서만 정의되어 있기 때문에 사용자가 정의한 클래스에 대해서는 적용할 수 없다.예를 들어 + 연산자는 int나 double 등의 자료형에 대해서는 정의되어 있지만 클래스 객체에 대해선느 정의돼있지 않다.Complex1 c1(10, 20);Complex1 c2(-5, 15);Complex1 c3 = c1 + c2; // Error - Complex1을 위한 + 연산자 없음복소수라는 것은 실수를 포함하는 수의 표현으로, 이에 대해서도 double형에서와 마찬가지로 사칙연산을 포함한 여러 가지 연산이 수학적으로 정의돼 있다.그러므로 Complex1 객체에 대해서도 이러한 연산을 사용할 수 있도록 하면 보다 자연스러운 문장..