다형성, 재귀함수 (항해일지 11일차)

김형준·2022년 5월 19일
0

TIL&WIL

목록 보기
11/45
post-thumbnail

1. 학습일지


1) ✔클릭! 파이썬 알고리즘 재귀함수

  • 오늘은 알고리즘 강의 2주차를 완강했다.
  • 어제 배운 이진 탐색 (binary search)에 이어 재귀함수(recursion)을 배웠다.
  • 재귀함수는 함수 내부에 자기 자신을 호출하는 함수를 뜻한다.
  • 재귀함수의 대표적인 예시가 팩토리얼이다. 팩토리얼은 n = n * (n-1)!과 같이 자신 직전까지의 곱에 자기 자신을 곱한 형태로 표현 가능하다.
  • 따라서 n=1인 경우에만 1을 리턴하고, 나머지 경우는 모두 (n-1)!으로 보내버린다.
  • 주의해야할 점은 자기 자신을 반복적으로 호출하기 때문에, 탈출 조건을 걸어줘야한다는 점이다.
  • 팩토리얼 재귀함수에서는 n=1인 경우 1을 리턴해주는 것이 탈출조건이다.
  • 실제로 파이썬은 재귀 호출 수가 1000을 넘어가면 오류를 뱉어낸다.

2) 알고리즘 테스트

  • 오늘은 알고리즘 주차의 마지막 날로, 알고리즘 테스트를 시행하며 막을 내렸다.
  • 알고리즘 테스트 문항은 그동안 풀었던 알고리즘의 응용 형태로, 두 문제를 혼합하여 출제되었다.
  • 나는 가장 먼저 보였던 행렬의 덧셈 음양 문제를 풀었다.
  • Replit url
  • 풀이는 간단했는데, 행렬로 들어온 두 배열을 이중 반복문을 통해 돌며 더해주고, 부호 배열에 담긴 boolean 값에 따라 양수, 음수를 지정했다.
  • 그동안 알고리즘은 파이썬 언어로만 풀어와서 자바로 푸는 데까지 꽤 어려움이 있었지만, 자바로 풀며 자바 문법과 더 친숙해진 것 같다.
  • 실제 최근 TIL에 자바 개념 정리가 많았던 이유도, 알고리즘을 풀며 자연스레 생긴 의문들을 탐구하던 과정이었다. 🤗

3) 자바 개념 공부

다형성(Polymorphism)

  • 다형성이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.
  • 하나의 객체가 어떻게 여러 타입을 가질까라는 의문을 가진다면 자연스럽게 상속을 떠올리게 될 것이다.
  • Java는 기본적으로 다중 상속을 제공하지 않는데, 어떻게 다형성을 구현할까?? 라는 의문이 들었지만 이는 상속의 입장에서만 생각한 것이다!
  • 부모 클래스와 자식 클래스가 있다고 생각해보면, 자식 클래스는 부모 클래스를 상속받는다.
  • 즉 부모 클래스를 상속받아 부모 클래스의 멤버변수는 물론 자식 클래스만의 멤버 변수도 존재한다. (확장의 개념)
  • 이 때 부모 타입의 참조 변수에 자식 타입의 인스턴스를 참조할 수 있다는 점이 바로 다형성의 개념이다!!
  • 즉 상속은 자식이 부모의 특성을 물려받아 사용한다면, 다형성은 부모가 자식 타입의 인스턴스를 참조한다. (방향성으로 본다면 반대 방향이다)
Parent pc = new Child();  // 허용
Child cp = new Parent();  // 오류 발생
  • 이게 가능한 이유는 자식 타입이 이미 부모의 멤버변수를 포함하고, 그 외에 다른 변수도 지니는 등 더욱 많은 멤버변수를 지녔기 때문에, 부모 타입에서는 이를 참조해도 문제가 생기지 않기 때문이다!!
  • 반대로 자식 타입은 부모 타입의 인스턴스를 참조할 때 상속 받은 멤버 변수 외에 다른 멤버변수들도 있기 때문에 오류가 발생한다!
  • 쉽게 생각해서 멤버변수가 더 많은 타입의 인스턴스를 참조할 수 있는 것!
  • 이에 따라 형변환도 가능한데, 멤버 변수가 더 많은 타입으로 형 변환할 때는 이를 생략할 수 없다.
  • 반대로 멤버 변수가 더 적은 타입으로 형 변환할 때에는 이를 생략해도 무방하다.

4) OOP 과제 제출

  • OOP 과제 GitHub URL
  • 오늘은 알고리즘 주차의 마지막 날로, 과제인 OOP 코드를 제출해야 한다.
  • 제출 마감 3시간 전에, 조금 더 구체적인 시나리오와 테스트 케이스를 담은 문서를 받아, 이를 최대한 반영하여 커밋했다.
  • 최대한 추상클래스와 인터페이스를 활용하기 위해 노력했다. (배운건 써먹어야지!!)
  • 추상클래스와 인터페이스를 사용하면 더욱 확장성이 좋다고 하는데, 직접 구현해보며 그 이유에 대해 알 것 같았다.
  • 일단, 추상클래스와 인터페이스는 추상 메서드를 제공하며(body가 없음) 이를 extends하거나 implements할 때 무조건 구현해야 한다.
  • 즉 특정 메서드의 정의를 강제하기에, 동일한 동작을 수행한다는 보장을 받을 수 있다. (물론 세부 내용은 다르겠지만)
  • 추가적으로 인터페이스의 모든 메서드는 추상 메서드이다.

2. 코멘트

  • 챕터2 알고리즘 주차가 막을 내렸다.
  • 내일 부터는 주특기인 스프링 학습이 시작된다.
  • 스프링 학습이 시작되어도 자바 언어에 대한 학습과 알고리즘 학습은 꾸준히 이어갈 것이다. 즉, 더더욱 바빠질 예정이다..
  • 3주차에는 또 다시 팀장이 되었는데,, 이왕 피할 수 없다면 즐겨야겠다..
  • 내일은 또 새로운 팀원들과 새로운 캐미를 맞추며 더욱더 열심히 공부해보겠다. 화이팅!!
profile
BackEnd Developer

0개의 댓글