각각의 문제 + 정답 + 상세풀이 + 예시 코드 + 출력 결과
클래스(Class)는 객체(Object)를 만들기 위한 '설계도'이다.
클래스는 속성과 메서드를 미리 정의한 설계도이다. 이 설계도를 이용해 실제로 만들어진 것이 객체 또는 인스턴스이다.
class Student:
def say_hello(self):
print('안녕하세요')
s1 = Student()
s1.say_hello()
안녕하세요
하나의 클래스로부터 생성된 모든 객체는 동일한 속성 값을 가진다.
같은 클래스로 만든 객체라도 인스턴스 속성은 객체마다 다를 수 있다. 예를 들어 같은 Car 클래스로 만든 자동차라도 브랜드 값은 다를 수 있다.
class Car:
def __init__(self, brand):
self.brand = brand
c1 = Car('현대')
c2 = Car('기아')
print(c1.brand)
print(c2.brand)
현대
기아
상속(Inheritance)은 'has-a' 관계를 표현하기 위해 사용된다.
상속은 주로 is-a 관계를 표현한다. 예를 들어 Dog는 Animal이다. has-a 관계는 자동차가 엔진을 가진다처럼 포함 관계에 가깝다.
class Animal:
pass
class Dog(Animal):
pass
print(isinstance(Dog(), Animal))
True
메서드를 정의할 때 첫 번째 매개변수인 self는 생략할 수 있다.
인스턴스 메서드에서 self는 객체 자신을 가리키는 필수 매개변수이다. self를 통해 객체의 속성에 접근한다.
class Person:
def set_name(self, name):
self.name = name
p = Person()
p.set_name('인수')
print(p.name)
인수
자식 클래스에서 부모 클래스와 동일한 이름의 메서드를 정의하는 것을 '메서드 오버로딩'이라고 한다.
부모 클래스의 메서드를 자식 클래스에서 다시 정의하는 것은 오버라이딩이다. 오버로딩은 같은 이름의 함수를 매개변수 형태에 따라 다르게 쓰는 개념이다.
class Animal:
def sound(self):
print('소리')
class Cat(Animal):
def sound(self):
print('야옹')
Cat().sound()
야옹
__init__ 메서드는 객체가 소멸될 때 자동으로 호출된다.
__init__은 객체가 생성될 때 호출되는 생성자 메서드이다. 객체가 소멸될 때 관련되는 메서드는 __del__이다.
class Book:
def __init__(self, title):
self.title = title
print('객체 생성')
b = Book('파이썬')
print(b.title)
객체 생성
파이썬
클래스 변수는 해당 클래스의 모든 인스턴스가 공유하는 변수이다.
클래스 변수는 클래스 영역에 선언되어 여러 인스턴스가 공통으로 참조할 수 있다.
class School:
name = '전북과학고'
s1 = School()
s2 = School()
print(s1.name)
print(s2.name)
전북과학고
전북과학고
@staticmethod로 정의된 정적 메서드는 self 매개변수를 받지 않는다.
정적 메서드는 인스턴스 상태나 클래스 상태를 직접 사용하지 않는 유틸리티 함수처럼 동작하므로 self나 cls를 받지 않는다.
class MathTool:
@staticmethod
def add(a, b):
return a + b
print(MathTool.add(3, 5))
8
추상 클래스(Abstract Class)는 인스턴스를 직접 생성할 수 있다.
추상 클래스는 자식 클래스가 반드시 구현해야 할 메서드 규약을 제공한다. 추상 메서드가 남아 있으면 직접 객체를 만들 수 없다.
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
print('추상 클래스는 설계 규약 역할')
추상 클래스는 설계 규약 역할
다형성(Polymorphism)이란 같은 이름의 메서드 호출에 대해 객체마다 다르게 반응하는 특성을 말한다.
다형성은 같은 메서드 이름을 호출해도 실제 객체의 종류에 따라 서로 다르게 동작하는 성질이다.
class Dog:
def speak(self):
return '멍멍'
class Cat:
def speak(self):
return '야옹'
for animal in [Dog(), Cat()]:
print(animal.speak())
멍멍
야옹
객체가 생성될 때 속성을 초기화하기 위해 사용하는 특별한 메서드의 이름은?
__init__은 객체가 생성될 때 자동으로 호출되어 인스턴스 속성을 초기화하는 생성자 역할을 한다.
class Student:
def __init__(self, name):
self.name = name
s = Student('민수')
print(s.name)
민수
부모 클래스 Animal을 Dog 클래스가 상속받는 올바른 문법은?
파이썬에서 상속은 class 자식클래스(부모클래스): 형식으로 작성한다.
class Animal:
def move(self):
print('움직인다')
class Dog(Animal):
pass
Dog().move()
움직인다
클래스 내에서 인스턴스 자신을 가리키는 데 사용되는 관례적인 매개변수 이름은?
self는 메서드를 호출한 인스턴스 자신을 가리키며, 인스턴스 속성에 접근할 때 사용한다.
class Counter:
def __init__(self):
self.count = 0
def up(self):
self.count += 1
c = Counter()
c.up()
print(c.count)
1
다음 중 정보 은닉(Information Hiding)의 주된 목적은?
정보 은닉은 객체 내부 데이터를 외부에서 함부로 바꾸지 못하게 하여 안정성과 무결성을 높이는 데 목적이 있다.
class Account:
def __init__(self):
self.__money = 1000
def get_money(self):
return self.__money
acc = Account()
print(acc.get_money())
1000
@property 데코레이터를 사용하는 가장 큰 이유는?
@property를 사용하면 메서드 결과를 괄호 없이 속성처럼 읽을 수 있어 코드가 더 직관적이다.
class Circle:
def __init__(self, r):
self.r = r
@property
def diameter(self):
return self.r * 2
c = Circle(5)
print(c.diameter)
10
다음 코드의 출력 결과는? class A: x=10 / class B(A): pass / class C(A): x=20 / print(A().x, B().x, C().x)
A의 x는 10이다. B는 A를 상속받아 x=10을 그대로 사용하고, C는 x를 20으로 재정의했기 때문에 10 10 20이 출력된다.
class A:
x = 10
class B(A):
pass
class C(A):
x = 20
print(A().x, B().x, C().x)
10 10 20
@classmethod로 정의된 메서드가 첫 번째 인자로 받는 것은?
클래스 메서드는 인스턴스가 아니라 클래스 자체를 첫 번째 인자로 받으며 관례적으로 cls라고 쓴다.
class Person:
count = 0
@classmethod
def show_count(cls):
print(cls.count)
Person.show_count()
0
다음 중 다형성(Polymorphism)을 가장 잘 설명한 것은?
다형성은 같은 이름의 메서드 호출이 객체 타입에 따라 다르게 실행되는 성질이다.
class Circle:
def draw(self):
print('원을 그린다')
class Square:
def draw(self):
print('사각형을 그린다')
for shape in [Circle(), Square()]:
shape.draw()
원을 그린다
사각형을 그린다
print(obj)를 실행할 때, 문자열을 반환하기 위해 구현해야 하는 매직 메서드는?
__str__은 객체를 사용자가 보기 쉬운 문자열로 표현할 때 사용된다. print(obj)를 실행하면 이 메서드의 반환값이 출력된다.
class Student:
def __str__(self):
return '학생 객체입니다'
obj = Student()
print(obj)
학생 객체입니다
s.find('x')와 s.index('x')의 가장 큰 차이점은?
find는 찾는 문자가 없으면 -1을 반환하지만 index는 ValueError 예외를 발생시킨다.
s = 'python'
print(s.find('x'))
try:
print(s.index('x'))
except ValueError:
print('ValueError 발생')
-1
ValueError 발생