목록파이썬 (29)
개발자 블로그

객체가 갖는 값에 직접 접근하는 것은 쉽게 오류를 범할 수 있으므로 지양해야한다 때문에 객체의 변수에 직접 접근을 하기보다 메소드를 통해 접근하는 것이 안전하다! 하지만, 메소드를 통해 접근을 하다보면 코드가 다소 복잡해 보일 수 있다. 따라서 우리는 안전성과 간결함 이 두마리 토끼를 잡고자 프로퍼티라는 개념을 배워야한다. 메소드를 통한 객체의 값에 접근 객체의 어트리뷰트의 직접 접근을 막는 방법으로 변수 앞에 __를 붙였다. 따라서 우리느 메소드를 통해 변수에 접근을 해야한다. 아래 두개의 메소드를 통해 값을 저장 및 참조하도록 하자! 1) getter(게터) 값 꺼내기, 이러한 성격의 메소드를 게터라한다. 2) setter(세터) 값 수정하기, 이러한 성격의 메소드를 세터라고 한다. n2의 값과 n3..

__slots__의 효과 앞서 블로깅을 통해 __dict__에 대해 알아보았다. 우리는 클래스를 생성할 때, 클래스 속성을 담는 딕셔너리가 생성된다는 것을 확인했다. 그리고 이러한 딕셔너리(변수를 담고 있는)를 통해 값을 수정하고 추가한다는 것도 확인했다. 하지만 해당 클래스의 객체를 생성할 때마다 딕셔너리가 생성이 되는데, 이러한 점 때문에 다소 상황에 따라 무수히 많은 객체를 생성해야 할 때 우리는 메모리상 큰 불이익을 얻을 수 있다. 객체마다 딕셔너리가 함께 생성되기 때문! (*딕셔너리는 키를 통해 값을 얻는 구조로 파이썬에서는 더 많은 정보를 갖고 있어 메모리가 적지 않다.) 메모리 상의 이득 이러한 부분을 보완하기 위해 나온 것이 __slots__이다. __slots__를 통해 변수를 등록해 두..

속성 감추기 개발을 하다보면 그리고 다른 사람과 협업을 하다 보면 바뀌지 않아야 할 값들이 바뀔 가능성은 항상 존재한다. 그래서 이를 바꾸면 안되는 것이라고 약속하는 방법과 실제로 정보를 숨김으로써 정보에 직접 접근을 막는 방법을 소개하겠다. 1. _속성이름 언더바(_) 한개 일 때이다. 이는 기능상으로는 변화는 없지만 개발자들끼리 약속한 관습이라고 할 수 있다. 속성 이름 앞에 _가 한개 존재한다면 이 값은 우리가 직접 접근을 하면 안된다! 라고 약속을 한 것과 같다. 따라서 접근은 가능하나 아래 언더바가 한개 존재한다면 이 속성은 직접 접근을 하지 않겠다고 약속한 것이다. 2. __속성이름 언더바(_) 두개일 때이다. 이는 실제로 속성에 직접 접근하는 못하게 막는 방법이다. 정확히는 못하게 한다기 보..
연산자 오버로딩이란? 클래스에서 상속시 사용되는 오버라이딩이란 개념이랑 다른 개념이다! 오버라이딩은 상속할 때 상속받은 메소드를 덮어 씌어서 새로운 메소드로 동작하도록 하는 것이고, 오버로딩은 하나의 메소드에 다양한 형태를 부여한 것이라고 말할 수 있다. 그러다 보니 오버로딩이란 개념에 대해 부정적으로 생각하는 개발자들이 많다고 한다! 왜냐면 다형성이 주는 부정적인 측면이 많기 때문! 오류가 났을 때 원인을 찾기 어렵다던가, 코드가 복잡해지는 것을 초래할 수 있다는 점에서 말이다. 미리 약속해 놓은 메소드가 호출 되도록하는 것이 연산자 오버로딩! 예를 들어 '+' -> __add__(), '-' -> __sub__() 이 호출되는 것인데, __add__()를 기존과 다르게 재정의하면, +연산자를 호출하면..
스페셜 메소드란? 객체를 불러올 때 자동으로 호출이 되는 메소드이거나 간접적(다른 경로를 통해)으로 호출할 수 있는 메소드를 가리켜 스페셜 메소드라고 한다. 대표 적으로 __init__ 메소드가 있다! 이는 객체를 생성할 때 자동으로 호출이 되는 메소드이다! 또 우리가 많이 사용하는 len, iter, str 도 사실은 원래 a.__len__(), a.__iter__(), a.__str__() 이렇게 생긴 메소드이나 우리가 알고있는 것 처럼 간접적으로 호출을 한다! 직접 스페셜 메소드를 만들어보면서 파이썬의 이해도를 높여보자! 1. iterator 객체가 되게끔 하기! 2. 1번을 성공했으면, 좀 더 수정해서 iterator 객체이면서 iterable 객체가 되게끔 해보자! *iterator 객체: ne..

isinstance 함수 isinstance(object, classinfo) 객체의 클래스 유형을 확인하는 함수! 첫 번째 인자는 객체, 두 번째 인자는 클래스이다! "이 객체가 저 클래스의 객체인가??"할 때 쓰는 함수! * 추가로 해당 객체가 직접 또는 간접적으로 상속 받은 클래스인 경우에도 True를 반환!! Object 클래스 객체 클래스?? 말이 뭔가 이상하다... 이 말은 즉, "파이썬의 모든 클래스는 object 클래스를 직간접적으로 상속한다."라는 사실을 알아야 한다. issubclass(class1, class2) 함수를 통해서도 살펴보자! (->class1은 class2를 상속 받았는가?) 이렇듯 파이썬의 모든 클래스는 object 클래스를 상속하고 있다! >>> dir(object..
부모 클래스와 자식 클래스 부모 클래스, 상위 클래스, 슈퍼 클래스라고도 읽으며, 베이스가 되는 클래스이다. 자식 클래슥, 하위 클래스, 서브 클래스라고도 읽으며, 베이스가 되는 클래스를 상속받아 추가할 메소드를 업데이트한 클래스이다. 따라서, 자식 클래스는 부모클래스의 모든 메소드를 갖고온다. 또한 새로운 별도의 메소드를 추가할 수도 있다. *새로운 메소드를 추가하는 과정에서 같은 메소드(이름이 같은 메소드)가 중첩이 될 때, 오버라이딩(부모로 부터 가져온 메소드가 가려지는)이 일어날 수 있다. 이를 메소드 오버라이딩이라고 한다. 이러한 경우 말그대로 덮어씌어진것이기 때문에 해당하는 부모 메소드가 사라진 것은 아니다. 가려진 것 뿐! 이것은 super()라는 상속 클래스를 호출할 때 쓰는 메소드를 활용..

소프트웨어 공학 관점에서의 클래스와 객체는 이렇게 설명한다고 한다. 클래스 : 객체를 만들기 위한 일종의 설계도 (우리가 흔히 많이 듣는 붕어빵 틀) 객체 : 클래스를 기반으로 만들어진 실제 사물 (붕어빵) 클래스의 기본 정의 "클래스 내에 들어갈 변수(데이터)와 메소드(기능)를 결정하는 것" 객체 안에 변수가 만들어지는 시점 Simple 클래스는 메소드만 있는 클래스이다! 위 클래스 객체를 만들때 언제 변수가 생성이 되는가! 그림을 보면 s1.seti(200) 이라고 변수를 대상으로 대입 연산을 진행하는 순간에 객체의 변수가 만들어진다. 하지만, 먼저 geti라는 메소드를 호출하면 아래와 같은 오류를 만난다. 그러나 클래스를 정의할 때, 객체 생성시 자동으로 호출되는 __init__ 메소드를 다음과 같..

1. 자료형 분류 파이썬이 제공하는 다음과 같은 자료형들을 가리켜 '시퀀스 타입(sequence type)'이라 한다. 문자열의 경우 텍스트 시퀀스 타입이라 하는데, 이것도 뭐 시퀀스 타입의 일종이다. 리스트 list 클래스의 객체 튜플 tuple 클래스의 객체 레인지 range 클래스의 객체 문자열 str 클래스의 객체 이들에겐 저장된 값의 순서 정보(위치 정보)가 존재하다는 특징이 있다. 레인지의 경우에는 시작과 끝값의 범위를 저장하지만 시작과 끝이라는 순서가 존재한다. 여튼 저장된 값의 순서가 존재한다는 것이 시퀀스(연속적인)타입의 특징이다. 다음 두 연산은 시퀀스 타입의 특징을 기반으로 진행되는 연산이다. 인덱싱 연산 s[0], s[1], s[2] 특정하는 값 하나를 참조하는 연산 슬라이싱 연산 ..

우연치 않게 오늘 알고리즘 문제를 풀다가 딕셔너리로 접근하여 푸는 문제를 만났다. 그래서 더욱 반갑기도 했지만, 막상 문제에 적용하려 하니 잘 안되기도 했다. 역시 많이 접해보고 사용해봐야 익숙해질 것 같다. 그래서 따로 블로그를 통해 위 내용에 대해 더 자세하게 작성해보려한다! 1) 키가 존재할 때와 존재하지 않을 때 키가 존재할 때와 하지 않을 때, 대입의 연산(=)의 경우에는 예외 없이 잘 값의 수정 또는 생성으로 잘 이어진다. 하지만 문제는 참조(ex. +=)를 하고 싶을 때 일어난다. 예를 들어 해당 키가 존재하지 않는 상황에서 값을 참조하려고 할 때, 예외가 발생한다. 예시를 들어보자! 이러한 경우 if와 else로 키가 존재할 때와 존재하지 않을 때 구분하여 처리할 수 있다. 하지만 더 나은..