본문 바로가기

프로그래밍 언어

self의 의미 정의 self는 클래스의 인스턴스를 나타낸다. 파이썬이 self를 사용하는 이유는 'Python은 메소드로 하여금 메소드가 속한 인스턴스는 자동으로 전달하지만, 자동으로 수신하지는 않는 방식(?)을 취했기 때문이다' 메소드의 첫번째 매개변수는 메소드를 호출하는 인스턴스이다 (이를 자동으로 전달한다고 표현하는가 보다) #it is clearly seen that self and obj is referring to the same object class check: def __init__(self): print("Address of self = ",id(self)) obj = check() print("Address of class object = ",id(obj)) Address of self = 1401.. 더보기
Python에서 Call By Reference 구현하는 법 핫한(?) GPT 에게 물어 보았다. --> 가변 객체를 함수 인자로 넘기라고 한다. 기본 지식으로... 파이썬은 Passed by Assignment 라고 한다. 즉, 어떤 값을 넘기느냐에 따라 Call By Value 혹은 Call By Reference로 동작할 수 있다고 한다. int, float와 같은 불가변(immutable)인자를 함수로 넘기면 call-by-value가 되고, list, tuple, dict과 같은 가변(mutable) 인자를 함수로 넘기로 넘기면 call-by-reference 로 동작한다. (정확하게 말하면, 파이썬은 모든 것이 객체 이기 때문에 가변 객체는 함수 안에서 새로운 값을 생성하지 않고, 불가변 객체는 새로운 값을 생성하기 때문에 각각 Call-by-refer.. 더보기
파이썬 프로퍼티(Property) 파이썬 속성 값을 숨기기 위해서 사용하는 setter, getter를 파이썬 프로퍼티를 이용하여 간단하게 구현할 수 있다 결론부터 말하자면, getter에는 @property를 붙이고, setter에는 @{속성이름}.setter 를 붙인다. @{속성이름}.deleter를 사용하여 속성을 제거하는데 사용할 수도 있다. class Person: def __init__(self): self.__age = 0 def get_age(self): # getter return self.__age def set_age(self, value): # setter self.__age = value james = Person() james.set_age(20) print(james.get_age()) class Person:.. 더보기
Data Classes 1. 설명 - 파이썬 3.7 부터 도입된 문법이고, 간략화된 데이터 정의를 가능하게 한다. class RegularCard: def __init__(self, rank, suit): self.rank = rank self.suit = suit def __repr__(self): return (f'{self.__class__.__name__}' \ f'(rank={self.rank!r}, suit={self.suit!r})' def __eq__(self, other): if other.__class__ is not self.__class__: return NotImplemented return (self.rank, self.suit) == (other.rank, other.suit) >>> queen_of.. 더보기
포인터 vs 참조자 void swap(int *x, int *y) 포인터는 변수의 주소가 파라미터로 전달된다. void swap(int& x, int& y) 참조자는 변수의 Alias가 파라미터로 전달된다. Alias와 파라미터의 주소는 동일하다. 따라서, 참조자의 값 변경시 전달된 변수의 값 또한 바뀐다. 차이점) 1. 포인터는 재 할당될 수 있지만, 참조자는 초기화시에 할당되고 재 할당이 안된다. 2. 참조자는 NULL 값을 할당 받을 수 없다. 포인터는 가능하다. 3. 포인터++은 메모리 이동이고, 참조자++은 값 1 증가이다 4. 포인터 변수의 주소와 변수 주소는 서로 다르지만, 참조자 주소와 변수 주소는 서로 동일하다. 5. 포인터는 ->로 멤버에 접근하고, 참조자는 . 로 멤버에 접근한다. 6. 포인터는 *로 역.. 더보기
std::nothrow std::nothrow 는 상수이며, operator new의 인자이다. 동적 할당 시 할당이 불가능하게 되면, 프로그램이 죽지 않고 null pointer를 리턴하게 해준다. 일반적으로 new 오퍼레이터가 동적할 당을 실패하면 bad_alloc 예외가 발생하게 되는데, nothrow를 인자로 사용하면 할당 실패시 null pointer를 반환하게 된다. (예외 처리 구문을 일일이 작성하지 않아서 좋을 듯 싶다) // nothrow example #include // std::cout #include // std::nothrow int main () { std::cout Allocation returned nullpt 출처) https://cplusplus.com/reference/new/nothrow/.. 더보기
fstream 처음 위치로 옮겨서 덮어쓰기 문제 상황 - 본인은 구조체를 파일에 쓰려고 하였다. 파일 스트림 std::fstream fIn({FILE_PATH}, std::ios::in | std::ios::out) 으로 파일을 열었고, 예를 들어 구조체 5개를 썼다. 하지만, 5개가 한번에 쓰여지는 상황은 아니고 (3개 + 2개) 혹은 (1개 + 4개)로 나뉘어서 씌여지는 상황이다. - 이때 구조체는 다음과 같은 순서로 쓰여지는 문제가 발생하였다. 구조체 3개를 쓰고, 파일이 닫힌뒤 다시 열어서 쓰면 구조체 4번째, 5번째가 파일 처음에 위치하게 되었다. 즉, 기존에 쓰였던 파일이 뒤로 밀렸다. struct{4} // 최근에 쓴 구조체 struct{5} struct{1} // 이하 기존에 쓴 구조체 struct{2} struct{3} - 본인은.. 더보기
C++ 파일 입출력 정리 1. 텍스트 파일과 바이너리 파일 2. C++ 파일 입출력 라이브러리 3. C++ 파일 입출력 모드 : 텍스트 I/O 와 바이너리 I/O, 파일 읽기 쓰기 4. 파일 모드 : 텍스트 I/O 와 바이너리 I/O 5. 멤버 함수를 이용한 텍스트 I/O : get(), put(), read(), write() 출처 : 명품 C++ 프로그래밍 (저자: 황기태) 1. 텍스트 파일과 바이너리 파일 파일은 기록되는 데이터 종류에 따라 텍스트 파일과 바이너리 파일로 나뉜다. 오직 글자로만 이루어진 문서 파일이 텍스트 파일이다. 각 글자에 2Byte 바이너리 코드를 부여하여 ASCII/UNICODE 를 만들었다. 공백은 ASCII로 0x20으로 저장된다. 키는 '\r(0x0D)'+'\n(0x0A)' 두 제어 문자로 기록.. 더보기