주간 랩업/[SSG] JAVA 기반 백엔드 개발 과정

[4주차] 자바 베이직 14일 - 18일

hooooolly 2024. 7. 8. 14:52

2024/07/01

자바 베이직 Day 14 - 추상화와 인터페이스


 

오늘은 저번 주에 이어 다형성의 4가지 전제조건을 고려하며 다형성을 코드로 구현해 보았다. 상속, 오버라이딩, 업캐스팅, 그리고 동적 바인딩을 의식하면서 추상화 클래스와 오버라이딩을 해본 것은 처음이었다. 코딩을 하면서 how와 why를 알고 제대로 배운다는 것이 이런 거구나 느꼈다. 또한 추상화의 장점인 정보 은닉과 객체 간의 복잡성 해소라는 의미가 어떤 것인지를 실습을 통해 이해할 수 있었는데, 조금 헷갈렸던 부분이 상속에서 protected를 쓰면 패키지가 다른 손자 클래스의 경우 할아버지 클래스에 접근이 불가하다는 점이었다.

 


2024/07/02

자바 베이직 Day 15 - 인터페이스


오늘은 추상화를 완전히 구현하는 인터페이스의 개념과 문법에 대해 배우고 실습을 해보았다. 인터페이스의 문법은 지금까지 배운 상속과 큰 차이가 있었는데, 클래스 접근제한자의 차이라던지 사용할 수 있는 멤버의 종류라던지, 인터페이스의 특징인  두 독립적인 객체의 메서드를 통한 메시지를 전달하고 연결하는 역할 때문에 그 목적에 맞는 목적을 가지는 메서드만을 사용할 수 있다는 것이 흥미로웠다. 나는 이런 것들이 어떤 목적 때문에 제한되는 건지 알고 싶어서 찾아보았다. 

더보기

자바 인터페이스에서 멤버는 기본적으로 public으로 지정되며, 이는 인터페이스의 특성과 관련이 있습니다. 인터페이스는 클래스가 구현해야 하는 메서드의 계약을 정의하는데, 이 계약은 모든 구현 클래스에 동일하게 적용되어야 합니다. 다음과 같은 이유로 protected 접근 제어자를 사용할 수 없습니다:

  1. 계약의 일관성: 인터페이스는 다른 클래스들이 구현해야 할 메서드를 명확히 정의합니다. 모든 클래스가 인터페이스를 동일하게 구현해야 하므로, 메서드는 public이어야 합니다. protected는 서브클래스와 같은 패키지 내의 클래스에서만 접근 가능하므로, 인터페이스의 공개 계약과 맞지 않습니다.
  2. 상속과 구현의 차이: 인터페이스는 구현보다는 행동을 지정하는 데 중점을 둡니다. 인터페이스는 클래스가 특정 메서드를 반드시 구현하도록 강제하지만, 상속 관계를 나타내지는 않습니다. protected는 상속을 통해 접근을 허용하는 것이기 때문에 인터페이스의 목적과 맞지 않습니다.
  3. 접근성의 모호성 방지: 인터페이스의 메서드가 protected라면, 이를 구현하는 클래스는 동일한 접근 제어자를 사용해야 합니다. 하지만 이는 인터페이스가 다른 패키지나 서브클래스에서 사용하는 경우 문제를 일으킬 수 있습니다. public만 사용함으로써 이러한 모호성을 방지할 수 있습니다.

이러한 이유로, 자바 인터페이스에서 멤버는 public만 가능하고, protected나 private 접근 제어자는 사용할 수 없습니다. private 메서드는 자바 9부터 인터페이스 내에서 사용 가능해졌지만, 이는 인터페이스 내부의 코드 재사용을 목적으로 하는 것이지, 구현 클래스와의 계약을 정의하는 것이 아닙니다.

자바에서는 서브클래스에서 부모 클래스의 메서드를 오버라이딩할 때 접근 제어자를 더 좁은 범위로 줄일 수 없습니다. 즉, 부모 클래스의 메서드가 public이라면, 이를 오버라이딩하는 서브클래스의 메서드는 public이어야 합니다. 마찬가지로 부모 클래스의 메서드가 protected라면, 서브클래스의 메서드는 protected 또는 public으로 오버라이딩할 수 있습니다.

  • 정적 바인딩: static 메소드는 컴파일 타임에 결정됩니다. 이는 메소드 호출이 컴파일 타임에 해당 클래스의 메소드로 결정된다는 의미입니다. 반면 인스턴스 메소드(일반 메소드)는 런타임에 실제 객체의 타입에 따라 동적으로 바인딩됩니다.
  • 클래스 레벨 메소드: static 메소드는 클래스 레벨에서 동작합니다. 이는 특정 객체가 아니라 클래스 자체에 속한다는 의미입니다. 따라서 특정 객체의 타입에 따라 동작이 달라지는 오버라이딩 개념과는 맞지 않습니다.
  • 오버라이딩 규칙: 오버라이딩은 인스턴스 메소드에만 적용됩니다. 이는 객체 지향 프로그래밍에서 다형성을 구현하기 위한 메커니즘이기 때문입니다. static 메소드는 클래스에 속하고 객체와는 관련이 없기 때문에 오버라이딩의 대상이 될 수 없습니다.

그리고 MySQL 8.0.21 버전을 설치하는데 계속 오류가 났었다. 서비스, 레지스트리 편집기를 왔다 갔다 하면서 설치, 삭제를 반복하다가 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini 파일에 한글 때문에 유니코드가 깨져서 설치가 안 되는 것이라는 걸 발견하고 컴퓨터 이름 바꾸고 재삭제, 재설치했더니 바로 되었다... 이거 때문에 몇 시간 동안 고생했는데 오히려 레지스트리 편집기도 사용해 보고 my.ini 파일 등 MySQL의 폴더를 찾아볼 수 있어서 좋았다. 

 

 

 

 


2024/07/03

자바 베이직 Day 16 - 데이터베이스


 

오늘은 어제 설치한 MySQL을 CLI 환경에서 실행하고 자바와 데이터베이스를 연결해서 쿼리 결과를 도출하는 작업을 했다. 과제로 다형성을 적용해서 데이터베이스와 연결하고 가져오는 기능을 클래스로 분리시켜야 하는데 이걸 내가 할 수 있을까..? 란 생각이 먼저 들었다. 아직 abstract와 interface 기능을 완전히 이해하진 않은 것 같아 이번 주말엔 꼭 인터페이스까지 다시 공부해야겠다는 생각이 든다. 그리고 시간이 남는다면 강사님이 추천하신 책을 읽어야겠다ㅜㅜ

 

 

 

 


2024/07/04

자바 베이직 Day 17 - 시스템 구현


오늘은 학생정보시스템을 구현하는 시간을 가졌다. 

위 그림과 같은 구조를 가지는 학생정보시스템은 학생의 학번과 이름, 성적, 성적순서 등을 관리하는 시스템인데 구조 파악 하는 것이 꽤 어려웠고 만약에 UML이 없었다면 이렇게 구조를 만들어 낼 수 없을 것 같다는 생각이 들었다. 아직 어떤 부분에 있어서 분리해야 하고 상속을 받고 인터페이스로 만들어야 하는지 감이 오지 않는다. 그래서 종이에 각 클래스에 담긴 메서드와 필드를 적고 그림을 그려보았다. 각각 어떤 기능을 하고 어떻게 하는 것인지는 이해하고 있지만 전체적인 구조를 파악하는 능력을 더 키워야 할 거 같다.

 

 

 


2024/07/05

자바 베이직 Day 18 - Exception


 

오늘은 어제의 복습으로 데이터베이스를 연동하여 CRUD 하는 간단한 프로그램을 만들었다. 이번에는 각 CRUD 기능에 초점을 두고 try catch 문으로 에러를 처리하는 기능을 추가하였는데, 모든 에러와 오류는 Throwable 클래스의 상속을 받는 클래스들이란 것을 처음 알게 되었다. 에러가 발생하면 그 해당하는 에러의 클래스 객체를 생성해서 에러 메시지를 출력해 주는 것이었다.

 

 

에러 처리를 하면서 느낀 것은 사용자 친화적인 프로그램을 만들기 위해서 꼼꼼한 에러 처리를 해야 한다고 느꼈다. 특히 작은 범위의 에러부터 잡으면서 나가야 어떤 부분에서 에러가 났는지 정확히 파악하고 코드를 고칠 수 있기 때문에 프로그램의 안정성에 있어 테스트와 에러 처리는 개발자가 가장 신경 써야 하는 부분이라고 생각이 들었다.

 

 

 


 

 

 

그리고 오늘로써 교육을 시작한 지 4주가 지났다!

다시 멘탈 잡고 해이해지지 말고 7월 한 달 성실히 보내자고 다짐해 본다..! 파이팅!