2024.05.20(월) 슈퍼코딩 부트캠프 백엔드/Spring 스노우 인턴 Day 1 일일보고

usnim·2024년 5월 20일
0

super_coding

목록 보기
16/35

📋 TO-DO LIST

스노우 인턴 활동 [o]

4주 1일차 강의 [o]

스노우 사수 도움 요청 업무 [o]

팀장님 지시 업무 [o]

중간/일일 업무 보고 작성 [o]

정기 팀/동기 스터디 모임 참석 및 성실도 [o]

📍 학습 내용 정리

추상화 (Interface)

추상 클래스는 일부 메서드를 구현하고 일부는 하위 클래스에서 구현할 수 있는 클래스입니다.

추상 클래스는 일반 클래스와 달리 인스턴스를 생성할 수 없습니다.

public abstract class Shape {
    abstract void draw();
    void display() {
        System.out.println("Displaying shape");
    }
}

위의 예시에서 Shape 추상 클래스는 draw() 메서드를 추상 메서드로 선언하고 있습니다.

이 메서드는 하위 클래스에서 구현해야 하지만, display() 메서드는 구현되어 있습니다.

인터페이스 (Abstract Class)

인터페이스는 자바에서 추상화를 달성하는 강력한 도구입니다.

인터페이스는 메서드의 명세만을 정의하고, 구현은 하위 클래스에서 담당합니다.

이를 통해 다중 상속을 지원하고 클래스 간의 결합도를 낮출 수 있습니다.

public interface Animal {
    void eat();
    void sleep();

// default void eat(){
// System.out.println("###를 먹고있습니다.");    
// }
// 이렇게 default를 사용해서 지정해도 되지만 권장하지 않음.
}

인터페이스와 추상 클래스를 사용하여 다형성을 구현하고,
코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.

📍 일일보고

부족한 점 :

스스로 시도해본 것들 :

다양한 사용자 역할을 정의하고, 해당 역할에 따라 사용자 클래스를 구현했다.

다형성을 활용하여 사용자 역할에 따라 다른 동작을 수행하도록 구현했다.

public interface AdminRole {
    void manageUsers();

    void changeSettings();
}
public interface CustomerRole {
    void order();

    void payment();

}
public class GeneralUser extends User {

    public GeneralUser(String username) {
        super(username);
    }
    
}
public interface ReviewerRole {
    default void writeReview() {
        System.out.println("ReviewRole를 맡아서 리뷰 작성할 수 있습니다.");
    }


    default void giveRating() {
        System.out.println("ReviewRole를 맡아서 점수 평가할 수 있습니다.");
    }
}
public class ReviewerUser extends User implements ReviewerRole {
    public ReviewerUser(String username) {
        super(username);
    }
}
public class SuperUser extends User implements ReviewerRole, AdminRole {
    public SuperUser(String username) {
        super(username);
    }


    @Override
    public void manageUsers() {
        System.out.println("슈퍼유저(" + username + ")는(은) 유저를 매니징할 수 있습니다.");
    }

    @Override
    public void changeSettings() {
        System.out.println("슈퍼유저(" + username + ")는(은) 세팅을 변경할 수 있습니다.");
    }
}
public abstract class User implements CustomerRole {
    protected String username;

    protected User(String username) {
        this.username = username;
    }

    @Override
    public void order() {
        System.out.println("유저(" + username + ")는(은) 주문을 할 수 있습니다.");
    }

    @Override
    public void payment() {
        System.out.println("유저(" + username + ")는(은) 결제를 할 수 있습니다.");
    }
}
public class UserManageSystem {
    public static void main(String[] args) {
        User[] users = new User[]{
                new GeneralUser("김지민"), new GeneralUser("이승우"), new GeneralUser("박현주"),
                new ReviewerUser("정민재"), new ReviewerUser("강지현"), new SuperUser("임서연"),
                new SuperUser("한민수")
        };

        for (User user : users) {
            if (user instanceof CustomerRole) {
                ((CustomerRole) user).order();
                ((CustomerRole) user).payment();
            }
            if (user instanceof ReviewerRole) {
                ((ReviewerRole) user).writeReview();
                ((ReviewerRole) user).giveRating();
            }
            if (user instanceof AdminRole) {
                ((AdminRole) user).manageUsers();
                ((AdminRole) user).changeSettings();
            }
        }
    }
}

해결 내용 :

추상클래스와 인터페이스의 내용을 머리에 확실히 정립할 수 있게
여러번 반복한 연습으로 확립할 수 있었다.

알게된 점 :

인터페이스의 default 메서드를 사용하여 기본 구현을 제공할 수 있다는 점을 학습했다.
(하지만 권장하지는 않는다.사용은 지양하려 한다.)

다형성을 통해 코드의 유연성을 높일 수 있다는 점을 상기시켰다.

헷갈리거나 실수한 점 :

ReviewerRole 인터페이스의 default 메서드를 사용할 때,

인터페이스를 구현하는 클래스에서 오버라이드하지 않아도 되는 점을 혼동하고 있었다.

회고 : 이제부터 정말 많이 마주할 인터페이스(Interface)에 대해서 학습했는데,

처음 학습할 때에는 추상 클래스와 혼동되는 부분이 있었는데 실전예제를 작성할때마다

개념이 확립되는것을 느꼈다. 연습은 실전처럼 하자라는 생각으로 이번 주도 놓치지 않고 열심히 해야겠다.

profile
🤦‍♂️

0개의 댓글