파이썬 내장 딕셔너리 타입을 사용하면 객체의 생명 주기 동안 동적인 내부 상태를 잘 유지할 수 있다.여기서 동적이라는 말은 어떤 값이 들어올지 미리 알 수 없는 식별자를 유지해야한다는 뜻아래는 학생 별 성적을 리스트로 추가하는 코드 예시이다.class SimpleGradebook: def __init__(self): self._grades = {} def add_student(self, name): self._grades[name] = [] def report_grade(self, name, score): self._grades[name].append(score) def average_grade(self, name): grades =..
Programming Language
중첩 클래스중첩 클래스는 다른 클래스 내부에 정의된 클래스를 의미한다. 중첩 클래스를 사용하면 외부 클래스의 구현에 대한 세부 사항을 숨길 수 있어 캡슐화와 유지보수성을 향상시킬 수 있다. 하지만, 중첩 클래스의 사용에는 주의가 필요하며, 특히 정적 멤버 클래스는 성능과 메모리 관리 측면에서 더 유리한 경우가 많다.중첩 클래스의 종류중첩 클래스는 크게 다음과 네 가지로 나눌 수 있다:정적 멤버 클래스 (Static Nested Class)비정적 멤버 클래스 (Non-Static Nested Class)익명 클래스 (Anonymous Class)지역 클래스 (Local Class)1. 정적 멤버 클래스정적 멤버 클래스는 외부 클래스의 인스턴스에 종속되지 않으며, 독립적으로 인스턴스화될 수 있다. 이는 외부..
태그달린 클래스는 여러 가지 의미를 하나의 클래스에 결합시키고, 해당 의미를 태그로 구분하여 표현하는 방식이다. 그러나 이는 여러 단점이 있으며, 클래스 계층구조를 활용하는 것이 더 효과적인 방법이다. 아래에서는 태그달린 클래스의 문제점과 이를 개선하기 위한 클래스 계층구조를 활용한 방법을 설명한다.태그달린 클래스태그달린 클래스는 여러 가지 의미를 하나의 클래스에서 표현하고, 해당 의미를 enum이나 tag로 구분하여 사용한다. 이때 주로 switch 문이나 조건문을 사용하여 각기 다른 동작을 구현하게 된다.예시: 태그달린 클래스// 코드 23-1 태그 달린 클래스 - 클래스 계층구조보다 훨씬 나쁘다! (142-143쪽)class Figure { enum Shape { RECTANGLE, CIRCL..
Interface인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 인터페이스는 해당 클래스를 사용하는 클라이언트가 클래스의 구현이 아닌, 정의된 메서드를 통해서만 객체와 상호작용할 수 있게 만든다.클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 알려주는 것이다. 인터페이스는 기능을 정의하는 것이 아니라 타입을 정의하는 용도로만 사용해야 한다. 즉, 인터페이스는 구현이 아닌 계약(contract)을 정의하는데 사용된다.상수 인터페이스상수 인터페이스는 메서드 없이, 오직 static final 필드만 포함된 인터페이스를 말한다. 이는 잘못된 사용 사례에 해당하며, Java에서는 상수를 정의할 때 인터페이스를 사용하는 것을..
itertools 메서드와 유용한 함수 소개itertools는 반복 가능한 객체를 다루는 데 유용한 함수들을 제공하는 파이썬 표준 라이브러리이다. 아래는 주요 메서드와 그 기능을 설명한 내용이다.코딩테스트 쓸만해 보이는 함수에는 체크했다. ✔1. itertools.chain여러 iterable을 하나로 이어 붙이는 기능을 한다.예제: it = itertools.chain([1, 2, 3], [4, 5, 6]) print(list(it)) # [1, 2, 3, 4, 5, 6]2. itertools.repeat ✔특정 값을 반복해서 생성한다. 반복 횟수를 지정할 수 있다.예제: it = itertools.repeat('안녕', 3) print(list(it)) # ['안녕', '안녕', '안녕']..
제네레이터와 리스트 컴프리헨션리스트 컴프리헨션다른 챕터에서도 언급했듯이 리스트 컴프리헨션은 메모리에 데이터를 생성하는 순간 로드 시킨다.value = [len(x) for x in open('my_file.txt')]print(value)제네레이터제네레이터는 이터레이터를 생성하여 값을 한 번에 하나씩만 로드한다.it = [100, 200, 300]roots = ((x, x**0.5) for x in it)print(next(roots)) # (100 10.0)다중 제네레이터를 통한 기능 구현아래는 화면의 이미지를 움직이게 하는 그래픽 프로그램의 예시이다.해당 코드의 문제점은 for 와 yield 의 반복으로 시각적인 잡음이 많다는 것이다.def move(period, speed): for _ in ..
자바에서는 상속과 구현을 통해 객체 지향적인 관계를 정의한다. 그 중에서도 인터페이스와 추상 클래스는 서로 다른 목적과 장점을 가지고 있다. 이 아이템에서는 추상 클래스보다 인터페이스를 우선적으로 사용해야 하는 이유와 그 활용 방안에 대해 다룬다.자바 다중 구현 메커니즘자바에서는 추상 클래스와 인터페이스를 사용하여 다중 구현을 처리할 수 있다. 이들 각각의 특징은 다음과 같다.추상 클래스다중 상속 불가능: 자바는 다중 상속을 지원하지 않기 때문에, 하나의 클래스만 상속할 수 있다. 이는 상위-하위 클래스 관계에서만 사용되며, 구현을 제공할 수 있다.상속 관계: 추상 클래스는 상위-하위 클래스 관계로 설계되어, 공통적인 동작을 상속받아 구현할 수 있다.제약: 추상 클래스는 구현체가 하나만 존재하고, 상속을..
상속은 객체 지향 프로그래밍에서 코드 재사용을 위한 강력한 수단으로 여겨지지만, 항상 최선의 선택은 아니다. 특히 잘못 사용하면 시스템에 오류를 일으킬 수 있는 위험이 있다. 이 아이템은 상속 대신 컴포지션(Composition) 을 사용해야 하는 이유와 그 장점에 대해 설명한다.상속의 문제점상속은 코드 재사용을 촉진할 수 있지만, 잘못 사용하면 캡슐화를 깨뜨리게 된다. 이는 클래스 간의 관계가 너무 강하게 결합되어, 상위 클래스의 구현이 변경될 때 하위 클래스에 예기치 않은 영향을 미칠 수 있다는 뜻이다. 특히, 상위 클래스의 구현 세부 사항에 의존하게 되면, 하위 클래스의 동작이 예기치 않게 변할 수 있다.상속의 예시와 문제예를 들어, HashSet을 상속받아 원소의 개수를 추적하는 Instrumen..
제네레이터의 문제 상황아래와 같이 도시 별 전체 여행자 수 중의 비율 확인하는 함수가 있다고 가정하자def normalize(numbers): total = sum(numbers) result = [] for value in numbers: percent = 100 * value / total result.append(percent) return resultvisits = [15, 35, 80]percentages = normalize(visits)print(percentages) # [11.53434, 26.76767, 61.53434]확장성을 위해 여행자 정보가 들어있는 파일을 읽는다고 가정하자아래의 로직에서는 결과적으로 빈 리스트를 리턴하게 된다.이터레..
불변 클래스란 무엇인가?불변 클래스는 그 인스턴스의 내부 값을 수정할 수 없는 클래스를 의미한다. 불변 클래스의 주된 특징은 객체를 한 번 생성한 후 상태가 변경되지 않으며, 이를 통해 객체를 보다 안전하게 공유할 수 있다.대표적인 불변 클래스 예시불변 클래스의 대표적인 예시는 다음과 같다:String: 문자열은 불변 객체로, 한 번 생성된 후 그 값이 변경되지 않는다.Boxing Class: Integer, Double 등의 래퍼 클래스는 불변이다.BigInteger, BigDecimal: 이 클래스들은 고정된 값을 갖고 있으며, 값을 변경하려면 새로운 인스턴스를 생성해야 한다.불변 클래스 규칙불변 클래스를 설계할 때 따를 수 있는 규칙은 다음과 같다:1. 객체의 상태를 변경하는 메서드를 제공하지 않는..