목록전체 글 (146)
개발자 블로그
연산자 오버로딩이란? 클래스에서 상속시 사용되는 오버라이딩이란 개념이랑 다른 개념이다! 오버라이딩은 상속할 때 상속받은 메소드를 덮어 씌어서 새로운 메소드로 동작하도록 하는 것이고, 오버로딩은 하나의 메소드에 다양한 형태를 부여한 것이라고 말할 수 있다. 그러다 보니 오버로딩이란 개념에 대해 부정적으로 생각하는 개발자들이 많다고 한다! 왜냐면 다형성이 주는 부정적인 측면이 많기 때문! 오류가 났을 때 원인을 찾기 어렵다던가, 코드가 복잡해지는 것을 초래할 수 있다는 점에서 말이다. 미리 약속해 놓은 메소드가 호출 되도록하는 것이 연산자 오버로딩! 예를 들어 '+' -> __add__(), '-' -> __sub__() 이 호출되는 것인데, __add__()를 기존과 다르게 재정의하면, +연산자를 호출하면..
스페셜 메소드란? 객체를 불러올 때 자동으로 호출이 되는 메소드이거나 간접적(다른 경로를 통해)으로 호출할 수 있는 메소드를 가리켜 스페셜 메소드라고 한다. 대표 적으로 __init__ 메소드가 있다! 이는 객체를 생성할 때 자동으로 호출이 되는 메소드이다! 또 우리가 많이 사용하는 len, iter, str 도 사실은 원래 a.__len__(), a.__iter__(), a.__str__() 이렇게 생긴 메소드이나 우리가 알고있는 것 처럼 간접적으로 호출을 한다! 직접 스페셜 메소드를 만들어보면서 파이썬의 이해도를 높여보자! 1. iterator 객체가 되게끔 하기! 2. 1번을 성공했으면, 좀 더 수정해서 iterator 객체이면서 iterable 객체가 되게끔 해보자! *iterator 객체: ne..
문제 설명 더보기 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요. 제한사항 주어지는 숫자의 개수는 2개 이상 20개 이하입니다. 각 숫자는 1 이상 50 이하인 자연수입니다. 타겟 넘버는 1 이상..
문제 설명 더보기 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 따라 1cm × 1cm의 정사각형으로 잘라 사용할 예정이었는데, 누군가가 이 종이를 대각선 꼭지점 2개를 잇는 방향으로 잘라 놓았습니다. 그러므로 현재 직사각형 종이는 크기가 같은 직각삼각형 2개로 나누어진 상태입니다. 새로운 종이를 구할 수 없는 상태이기 때문에, 이 종이에서 원래 종이의 가로, 세로 방향과 평행하게 1cm × 1cm로 잘라 사용할 수 있는 만큼만 사용하기로 하였습니다. 가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 sol..
문제 설명 더보기 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. "[닉네임]님이 들어왔습니다." 채팅방에서 누군가 나가면 다음 메시지가 출력된다. "[닉네임]님이 나갔습니다." 채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다. 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다. 채팅방에서 닉네임을 변경한다. 닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다. 예를 들어,..
EagerLoading이란 즉시 로딩한다는 말로 lazyloading과 반대되는 개념이라 할 수 있다. 따라서 lazyloading의 문제인 N+1과 같은 문제를 해결해 줄 수 있다! 그렇다고 해서 lazyloading이 안좋다는 말이 아니다! 때에 따라 더 효율적인 코드를 짜기 위해 다양한 방법을 알기 위함이다. 그렇다면, 즉시 로딩을 하기 위해 장고는 어떤 메소드를 제공하는가! 바로 select_related()와 prefetch_related()라는 메소드이다. 먼저 N+1 문제를 예제를 살펴보면서 알아보자! users : Qeuryset() = User.objects.all() # lazyloading으로 아직 sql을 호출 안 함. for user in users: user.userinfo # ..
Lazy Loading QuerySet의 특징으로는 Lazy Loading, 지연 로딩이 있다. 지연 로딩은 QuerySet을 evaluation 하기 전까지 QuerySet에서 filter()를 추가하고 exclude() 하는 것은 데이터베이스에서 쿼리를 수행하지 않는다. QuerySet을 evaluation하는 방법은 여러 가지가 있다. len() , list() , bool() , repr() 등을 QuerySet에 사용했을 때 QuerySet은 evaluation 되고 실제로 데이터베이스에서 쿼리를 수행하게 된다. Caching 각 QuerySet은 데이터베이스로 접속을 최소확 하기 위해 cache를 갖고 있다. QuerySet이 Evaluation 되기 전엔 cache가 비어있지만 evaluat..
isinstance 함수 isinstance(object, classinfo) 객체의 클래스 유형을 확인하는 함수! 첫 번째 인자는 객체, 두 번째 인자는 클래스이다! "이 객체가 저 클래스의 객체인가??"할 때 쓰는 함수! * 추가로 해당 객체가 직접 또는 간접적으로 상속 받은 클래스인 경우에도 True를 반환!! Object 클래스 객체 클래스?? 말이 뭔가 이상하다... 이 말은 즉, "파이썬의 모든 클래스는 object 클래스를 직간접적으로 상속한다."라는 사실을 알아야 한다. issubclass(class1, class2) 함수를 통해서도 살펴보자! (->class1은 class2를 상속 받았는가?) 이렇듯 파이썬의 모든 클래스는 object 클래스를 상속하고 있다! >>> dir(object..
부모 클래스와 자식 클래스 부모 클래스, 상위 클래스, 슈퍼 클래스라고도 읽으며, 베이스가 되는 클래스이다. 자식 클래슥, 하위 클래스, 서브 클래스라고도 읽으며, 베이스가 되는 클래스를 상속받아 추가할 메소드를 업데이트한 클래스이다. 따라서, 자식 클래스는 부모클래스의 모든 메소드를 갖고온다. 또한 새로운 별도의 메소드를 추가할 수도 있다. *새로운 메소드를 추가하는 과정에서 같은 메소드(이름이 같은 메소드)가 중첩이 될 때, 오버라이딩(부모로 부터 가져온 메소드가 가려지는)이 일어날 수 있다. 이를 메소드 오버라이딩이라고 한다. 이러한 경우 말그대로 덮어씌어진것이기 때문에 해당하는 부모 메소드가 사라진 것은 아니다. 가려진 것 뿐! 이것은 super()라는 상속 클래스를 호출할 때 쓰는 메소드를 활용..
소프트웨어 공학 관점에서의 클래스와 객체는 이렇게 설명한다고 한다. 클래스 : 객체를 만들기 위한 일종의 설계도 (우리가 흔히 많이 듣는 붕어빵 틀) 객체 : 클래스를 기반으로 만들어진 실제 사물 (붕어빵) 클래스의 기본 정의 "클래스 내에 들어갈 변수(데이터)와 메소드(기능)를 결정하는 것" 객체 안에 변수가 만들어지는 시점 Simple 클래스는 메소드만 있는 클래스이다! 위 클래스 객체를 만들때 언제 변수가 생성이 되는가! 그림을 보면 s1.seti(200) 이라고 변수를 대상으로 대입 연산을 진행하는 순간에 객체의 변수가 만들어진다. 하지만, 먼저 geti라는 메소드를 호출하면 아래와 같은 오류를 만난다. 그러나 클래스를 정의할 때, 객체 생성시 자동으로 호출되는 __init__ 메소드를 다음과 같..