스노우 인턴 활동 [o]
4주 1일차 강의 [o]
스노우 사수 도움 요청 업무 [o]
팀장님 지시 업무 [o]
중간/일일 업무 보고 작성 [o]
정기 팀/동기 스터디 모임 참석 및 성실도 [o]
추상 클래스
는 일부 메서드를 구현하고 일부는 하위 클래스에서 구현할 수 있는 클래스입니다.
추상 클래스
는 일반 클래스와 달리 인스턴스를 생성할 수 없습니다.
public abstract class Shape {
abstract void draw();
void display() {
System.out.println("Displaying shape");
}
}
위의 예시에서 Shape 추상 클래스는 draw() 메서드를 추상 메서드
로 선언하고 있습니다.
이 메서드는 하위 클래스에서 구현해야 하지만, display() 메서드는 구현되어 있습니다.
인터페이스
는 자바에서 추상화를 달성하는 강력한 도구입니다.
인터페이스
는 메서드의 명세만을 정의하고, 구현은 하위 클래스에서 담당합니다.
이를 통해 다중 상속을 지원하고 클래스 간의 결합도를 낮출 수 있습니다.
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)에 대해서 학습했는데,
처음 학습할 때에는 추상 클래스와 혼동되는 부분이 있었는데 실전예제를 작성할때마다
개념이 확립되는것을 느꼈다. 연습은 실전처럼 하자라는 생각으로 이번 주도 놓치지 않고 열심히 해야겠다.