🍎 How's the 14th day going?
어제 했던 객체화를 나름 마무리 잘했다. 조금 까이긴 했지만.. 많은 발전을 했다. Enum이 반드시 하나만 하는게 아니라 쌍으로 무조건 결합되야 하는걸 사용하는 방법이 너무 괜찮았다. 그리고 뭔가 개념적인 부분에 대해서 많이 배울 수 있었다. 이제 객체화 고찰 그만해도 될 것 같다. 이번 한 주 동안 좀 실력이 는거 같아서 좋다. 특히 객체화를 위한 관계에 대한 생각을 많이 할 수 있어서 좋았다. 기능 간의 연계, 서로 간의 움직이에 대한 설계 이런 것이 왜 중요한지 알 수 있었다. 해보면서 배우는 거 같다. 젤 기억에 남는 말은 인터페이스는 명세서다. 이게 젤 기억에 남았던 거 같다. 아 SQL 코드 카타는 좀 어려워질 때까지 어떤 문제였는지만 적고 끝내겠다.

🍊코드카타 목록
- 이름이 없는 동물의 아이디
- 중성화 여부 파악하기
- 조건에 맞는 회원수 구하기
- 덧칠하기
💡오늘 정리 목록
- 인터페이스
- 추상클레스
🚩오늘의 회고
1. 코드카타
1) 이름이 없는 동물의 아이디
where, order by 사용 문제
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID
2) 중성화 여부 파악하기
어제 사용학습했던 CASE WHEN 문제
SELECT ANIMAL_ID, NAME,
CASE
WHEN SEX_UPON_INTAKE LIKE '%Neutered%'
OR SEX_UPON_INTAKE LIKE '%Spayed%'
THEN 'O' ELSE 'X' END AS 중성화
FROM ANIMAL_INS
3) 조건에 맞는 회원수 구하기
COUNT()함수 사용 문제
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE>=20 AND AGE<30 AND YEAR(JOINED) = 2021
4) 덧칠하기
처음에는 브루트푸스 방식으로 1~N까지 벽을 탐색해서 칠해야하면 움직이는 섹션으로 구성하려고 했다.
그 다음에 고민했던 방식은 큐, SECTION을 큐로 바꿔서 하나를 빼고 그 만큼 칠하는 방식으로 가려고 했음.
둘 중에서 벽이 범위가 커서, 그냥 SECTION을 큐로 꺼내오는 방식으로 구현했다. 음.. 쏘쏘한 문제였다.
import java.util.*;
class Solution {
public int solution(int n, int m, int[] section) {
int answer=0;
Integer[] boxedBuff = Arrays.stream(section).boxed().toArray(Integer[]::new);
Queue<Integer> queue = new LinkedList<>(Arrays.asList(boxedBuff));
while(!queue.isEmpty()){
int t = queue.poll();
while(!queue.isEmpty() && queue.peek() < (t + m)){
queue.poll();
}
answer++;
}
return answer;
}
}
2. 인터페이스
한줄 : 인터페이스는 명세서
그냥 어떻 기능을 해라고 알려주는 지침서로 이해하면 편하다. 사용하는 이유는 다형성 확보. 선언은 인터페이스 생성은 구현된 클래스로 한다는 점이 가장 기본 적인 개념이다.
자바에서 인터페이스는 interface 키워드를 사용하여 정의된다. 인터페이스는 다중 상속을 지원하므로, 클래스는 여러 인터페이스를 구현할 수 있습니다. 이러한 특성은 자바에서 다형성을 실현하는 중요한 방법 중 하나다. 인터페이스를 사용하면 코드를 더 간결하고 유연하게 만들 수 있고, 코드의 재사용성을 높이고 유지보수가 쉬워집니다. API의 설계와 구현을 분리하여 개발 과정을 효율적으로 관리할 수 있다.
1) 인터페이스 규칙
- 모든 메서드 구현: 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 합니다. 구현되지 않은 메서드가 있다면 컴파일 오류가 발생합니다.
- 메서드 시그니처 일치: 구현 클래스에서 인터페이스의 메서드를 구현할 때 메서드의 시그니처(이름, 매개변수 형식, 반환 유형)가 인터페이스의 메서드와 일치해야 합니다. 시그니처가 일치하지 않으면 컴파일 오류가 발생합니다.
- 접근 제어자: 인터페이스의 메서드는 기본적으로 public으로 선언되어야 합니다. 따라서 구현 클래스에서는 해당 메서드를 public 접근 제어자로 구현해야 합니다.
- 추가 메서드 구현: 구현 클래스에서는 인터페이스에 정의된 메서드 외에 추가적인 메서드를 구현할 수 있습니다. 이는 해당 클래스의 특정 기능을 추가할 때 유용합니다.
- 인터페이스 상속: 인터페이스는 다른 인터페이스를 상속할 수 있습니다. 이 경우 상속받은 인터페이스의 모든 메서드를 구현해야 합니다.
- 다중 인터페이스 구현: 클래스는 하나 이상의 인터페이스를 구현할 수 있습니다. 이 경우 각 인터페이스의 모든 메서드를 구현해야 합니다.
- 인터페이스의 상수 사용: 인터페이스 내에서 선언된 상수는 구현 클래스에서 따로 선언하지 않고 인터페이스의 이름을 통해 직접 접근할 수 있습니다
2) 인터페이스 간단한 예
// 인터페이스 정의
interface Animal {
void makeSound();
}
// 각 동물 클래스들은 Animal 인터페이스를 구현합니다.
class Dog implements Animal {
public void makeSound() {
System.out.println("멍멍");
}
}
class Cat implements Animal {
public void makeSound() {
System.out.println("야옹");
}
}
public class Main {
public static void main(String[] args) {
// 각 동물 인스턴스를 생성하고 소리를 내도록 합니다.
Animal dog = new Dog();
Animal cat = new Cat();
dog.makeSound(); // 멍멍
cat.makeSound(); // 야옹
}
}
3. 추상 클래스
추상 클래스도 자기 스스로 인스턴스를 만들 수 없다. 그래서 인터페이스처럼 상속으로만 구현될 수 있다. 그치만 추상클래스와 인터페이스의 가장 큰 차이는 상속받는 자식과의 결합도차이정도를 떠올릴 수 있는 것 같다. 인터페이스는 명세서 느낌으로 리모콘을 예시로 들면 전원 끄기 기능 / 채널 변경 기능 / 볼륨조절기능 / 음소거 기능, 이렇게 어떤 기능을 쓸 껀지 나열한다고 생각하면 된다. 하지만 추상클래스는 여기서 전원 끄기(맨 위에 위치해서 자외선을 통해서 끈다) 이런 식으로 사용할 방식까지 정해놓은 상태로 있다고 생각하면 좋을 거 같다. 두개 모두 다형성 확보를 위해 쓰지만, 인터페이스는 기능 명세만 같으면 교환할 수 있지만, 추상클래스는 좀 더 많이 구현된 느낌으로 설계도에 좀 더 가깝다고 볼 수 있다.
1) 추상 클래스 주요 특징
- 추상 메서드 포함: 추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있습니다. 추상 메서드는 메서드 시그니처만을 정의하고, 구현 내용은 하위 클래스에서 제공해야 합니다.
- 일반 메서드 포함: 추상 클래스는 추상 메서드 외에도 일반 메서드를 포함할 수 있습니다. 이러한 일반 메서드는 추상 클래스를 상속받은 하위 클래스에서 필요에 따라 재정의할 수 있습니다.
- 인스턴스 생성 불가능: 추상 클래스는 인스턴스를 직접 생성할 수 없습니다. 대신 추상 클래스를 상속받은 하위 클래스를 통해 객체를 생성합니다.
- 상속을 통한 확장: 추상 클래스는 다른 클래스에게 상속되어 확장될 목적으로 설계됩니다. 추상 클래스를 상속받은 하위 클래스는 추상 메서드를 구현하고 나머지 일반 메서드를 재정의하여 기능을 확장할 수 있습니다.
- 추상 클래스와 인터페이스의 차이: 추상 클래스는 인스턴스 생성이 불가능하고 상속을 통해 확장되며, 일반 메서드와 추상 메서드를 모두 포함할 수 있습니다. 반면에 인터페이스는 추상 메서드만을 포함하고, 다중 상속을 지원하며, 다양한 클래스들에게 공통된 동작을 정의하는 데 사용됩니다.
2) 예제 코드
// 추상 클래스 정의
abstract class Shape {
// 추상 메서드 선언
abstract double area();
// 일반 메서드
void display() {
System.out.println("도형입니다.");
}
}
// 추상 클래스를 상속받은 구체적인 클래스 정의
class Rectangle extends Shape {
double width, height;
Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// 추상 메서드 구현
double area() {
return width * height;
}
}
public class Main {
public static void main(String[] args) {
Rectangle rectangle = new Rectangle(5, 3);
System.out.println("사각형의 넓이: " + rectangle.area());
rectangle.display(); // 일반 메서드 호출
}
}
🚩오늘의 회고
오늘의 회고는 객체화.. 이제 좀 객체화의 의미를 잘 알겠다. 그리고 UML의 다양한 다이어그램들이 왜 그렇게 관계를 표현하는데 집중하는 지에 대해서도 잘 알 수 있었다. 정처기 하면서 이런게 있다곤 배웠는데 이렇게 활용될 수 있다는 점은 참 좋고 새롭게 배울 수 있는 부분이었다. 그리고 항상 하나 배울 때 마다 느끼는 건데 더 잘하고 싶다. 더 !!
다음에는 이번에 했던 과제 정도는 정말 쉽게 할 수 있을 거 같다. 더 좋은 구조로 이상 끝!