TIL 06

오늘 한 일 / 배운점

  • 팀 내 코드 리뷰
    → 팀에 스위프트 잘 아는 분이 계신데
    switch 문에서 열거형(enum)으로 정의된 걸 사용하는 게 좋다고 한다.
    가독성도 올라가고 실무에서는 보통 이렇게 한다고.. 설명 들을 때는 이따가 바로 해봐야지 했는데
    막상 내 코드를 보니 어디에 적용해야 할지 모르겠다 orz..
    열거형에 대해 두루뭉실한 것도 있고 해서 더 찾아보면서 해볼 예정
  • 팀 과제 Lv.2 코드 작성
  • 7/25 20:00 알고리즘 세션 (YH 튜터님)
    → 어제 튜터님이 한번 생각해오세요 한 알고리즘 문제는 다른 것에 밀려 하지 못했다.. (반성)
    2일간 참여하면서 느낀 점은 알고리즘 문제도 swift 문법이 받쳐줘야 가능한만큼 문법 공부의 중요성을 알았고, 튜터님 왈, 시간이 걸리더라도 천천히 곱씹으면서 생각하고 반복하다 보면 노하우가 생기고 머릿 속에 알고리즘 회로가 생긴다고 하셨다.
    쉬는 날이나 틈틈이 조금씩이라도 문제를 풀어보는 시간을 가져야겠다.

과제

  • 이번 팀 과제에서 열거형(enum) 적극 활용하기

느낀점

오늘 코드 작성 중 궁금했던 거 하나
과제 Lv.3 부분에 클래스 상속해서 쓰라는 게 있어서 그 부분을 적용하려 했는데

class Burger: Menu {
   override init() { 
       menuItems.append(MenuItem(name: "진도 대파 크림 크로켓 버거", price: 5000, info: "")) // 'self' used before 'super.init' call
       menuItems.append(MenuItem(name: "빅맥", price: 5000, info: "")) // 'self' used before 'super.init' call
       menuItems.append(MenuItem(name: "더블 쿼터파운더 치즈", price: 5000, info: "")) // 'self' used before 'super.init' call
     ...

'self' used before 'super.init' call 에러를 뿜어대기 시작

class Burger: Menu {
   override init() { 
			super.init()
       menuItems.append(MenuItem(name: "진도 대파 크림 크로켓 버거", price: 5000, info: "")) 
       menuItems.append(MenuItem(name: "빅맥", price: 5000, info: "")) 
       menuItems.append(MenuItem(name: "더블 쿼터파운더 치즈", price: 5000, info: ""))
     ...

super.init() 을 추가해 주니 조용해졌는데
super.init()의 의미를 알고 싶어 구글링 하다 보니

?_?
여기서 super는 뭐고 슈퍼클래스는 뭐드라… 분명 전에 자주 보긴 했는데
또 머리가 안 돌아가기 시작했다.

슈퍼클래스 : 부모 클래스(parent class)와 같은 말
super : 자식 클래스에서 부모 클래스의 메서드를 호출하거나
부모 클래스 내부를 만질 수 있게 하는 마법의 키워드라고 함..

class Drinks {
 func takeASip() {
 	print("홀짝홀짝")
 }
}

class Coffee: Drinks {
	override func takeASip() {
		super.takeASip()
		print("오늘따라 커피가 걸쭉하네;;")
	}
}

let coffee = Coffee()
coffee.takeASip() 
// 홀짝홀짝
// 오늘따라 커피가 걸쭉하네;;

마땅히 좋은 예시가 떠오르지 않아서
이게 맞는 말인지 모르겠지만… 어찌 됐든 이 코드를 실행하면
자식 클래스인 Coffee에서 부모 Drink의 takeASip 함수를 오버라이딩했지만
super.takeASip()으로 한번 부모 클래스의 함수 내용을 그대로 실행시켜주고,
추가로 코드가 들어가서 결과물이 둘 다 출력되는 것을 알 수 있다.

아무튼 이것이 중요한 게 아니고!
override init() { } + super.init() 이 왜 필요한가! 그 답은

  1. override init()으로 Menu 클래스의 초기화 메서드를 재정의하고
  2. super.init()을 함으로 클래스의 초기화 메서드를 호출.
    상속받은 menuItems 배열에 Burger 클래스의 메뉴들을 추가할 수 있게 된다고 한다.

쉽게 말해 부모 클래스에서 initialize(초기화) 하는 걸
내가 하위 클래스에서 오버라이드 하려 했는데
이 경우에는 하위 클래스에서 초기화를 진행하기 전에 반드시 부모 클래스 이니셜 라이저도 호출해야 한다.
그렇게 안 하면 상위 클래스에 있는 속성이나
다른 초기화 작업들이 올바르게 이루어지지 않아서 컴파일러에서 에러를 뿜어대는 거라고..

이것 말고도 여기저기 터지고 난리지만
내일도 열심히 파이팅..하자!