36.8 연습문제: 리스트에 기능 추가하기

다음 소스 코드에서 리스트(list)에 replace 메서드를 추가한 AdvancedList 클래스를 작성하세요. AdvancedListlist를 상속받아서 만들고, replace 메서드는 리스트에서 특정 값으로 된 요소를 찾아서 다른 값으로 바꾸도록 만드세요.

practice_class_inheritance.py

                         
...
                         
 
x = AdvancedList([1, 2, 3, 1, 2, 3, 1, 2, 3])
x.replace(1, 100)
print(x)

실행 결과

[100, 2, 3, 100, 2, 3, 100, 2, 3]

정답

class AdvancedList(list):
    def replace(self, old, new):
        while old in self:
            self[self.index(old)] = new

해설

list를 상속받아서 AdvancedList를 만들라고 했으므로 클래스는 class AdvancedList(list):와 같이 만듭니다.

replace 메서드는 리스트에서 특정 값으로 된 요소를 찾아서 다른 값으로 바꾼다고 했습니다. 먼저 클래스의 메서드 안에서 현재 객체를 조작하려면 self를 이용해야 합니다. 여기서는 AdvancedListlist를 상속받았으므로 self로 리스트의 모든 메서드를 사용할 수 있습니다.

특정 값을 찾을 때는 리스트의 index 메서드를 사용하고, index로 찾은 인덱스를 self에 지정해준 뒤 새 값을 할당하면 값을 바꿀 수 있습니다. 이때 리스트에서 같은 값이 여러 개 들어있을 수도 있으므로 모든 값을 바꿔주어야 합니다.

즉, while로 반복하면서 self에 특정 요소가 있을 때 계속 반복하도록 만든 뒤 요소를 바꿔주면 됩니다. 물론 리스트에서 특정 요소가 있는지 확인할 때는 in 연산자를 사용합니다. 이 방식을 사용하면 리스트에서 요소를 계속 바꾸다가 바꿀 값이 없으면 반복을 끝냅니다.

while self.count(찾을값) != 0:처럼 count 메서드를 사용해서 요소 개수가 0이 아닐 때 계속 반복하는 방식도 가능합니다.