[Java] μΈν°νμ΄μ€μ μ©λ(usage)μ λν΄
by rlaehddnd0422μΆμ ν΄λμ€λ μμμ ν΅ν΄ μμ(νμ) ν΄λμ€μμ μ€κ³λλ₯Ό μμ±νλλ‘ μ λνλ ν΄λμ€μ λλ€. (= λ―Έμμ± μ€κ³λ)
- μΆμ ν΄λμ€λ μμμ μν ν΄λμ€μ΄κΈ° λλ¬Έμ λ°λ‘ κ°μ²΄λ₯Ό μμ±ν μ μμ΅λλ€.(μ¬μ€ μ΅λͺ λ΄λΆ ν΄λμ€λ‘ κ°μ²΄ μμ±μ κ°λ₯νμ§λ§ μ΄λ μλν λ°κ° μλκΈ° λλ¬Έμ κ°μ²΄λ₯Ό μμ±ν μ μλ€κ³ μμ±νμμ)
- μΆμ ν΄λμ€λ λ©μλμλ 'abstarct' μμ½μ΄λ₯Ό μ¬μ©ν΄μ μμμ ν΅ν΄ 'ꡬν' ν΄μΌ νλ€λ κ²μ μλ €μ£Όκ³ μ μΈλΆλ§ μμ±νλ 'μΆμ λ©μλ'λ₯Ό μ μΈν μ μμ΅λλ€.
- μμ(νμ) ν΄λμ€μμλ μΆμ ν΄λμ€μ 'μΆμ λ©μλ'λ₯Ό μ€λ²λΌμ΄λ© λ° κ΅¬ννμ¬ λΉλ‘μ μ€κ³λλ₯Ό μμ±μν¬ μ μμ΅λλ€.
abstract class Animal {
abstract void bark(); // νμ ν΄λμ€μμ λ€λ₯΄κ² λμνλ λ©μλ
public void sleep() { // νμ ν΄λμ€μμ λμΌνκ² λμνλ λ©μλ
System.out.println("Sleeping...zZZ");
}
}
public class Dog extends Animal{
private String species;
public Dog(String species) {
this.species = species;
}
@Override
public void bark() {
System.out.println("This puppy barks like " + this.species);
}
}
μΆμ ν΄λμ€μ λν λ μμΈν λ΄μ©μ μλ λ§ν¬ μ°Έμ‘°
μλ°μλ μ΄ μΆμ ν΄λμ€μ λ§€μ° λΉμ·ν μ©λλ‘ μ¬μ©λλ 'μΈν°νμ΄μ€'λΌλ κ²μ΄ μ‘΄μ¬ν©λλ€.
μΆμ ν΄λμ€λ μΌλΆλ§ μμ±λ 'λ―Έμμ± μ€κ³λ'λΌκ³ νλ©΄, μΈν°νμ΄μ€λ 'κΈ°λ³Έ μ€κ³λ'μ λλ€.
μΆμ ν΄λμ€μμλ κ°μ λμμ νλ λ©μλμ λν΄μ abstract ν€μλλ₯Ό μ¬μ©νμ§ μκ³ μΆμ ν΄λμ€μ ꡬννλ€λ©΄, μΈν°νμ΄μ€μμλ νλλ λΉ μ§μμ΄ μμ±λλ λͺ¨λ λ©μλκ° μΆμ λ©μλλ‘ μ μΈλμ΄μΌ ν©λλ€. ( Before JDK 1.8 ver )
μ΄μ΄μ μΈν°νμ΄μ€μ κΈ°λ³Έ μ¬μ©λ²μ λν΄ μμλ³΄κ² μ΅λλ€.
μΈν°νμ΄μ€(interface)
μΈν°νμ΄μ€λ?
μΈν°νμ΄μ€λ ν΄λμ€λ€μ΄ νμλ‘ κ΅¬νν΄μΌ νλ μΆμ μλ£νμ λλ€.
μΆμ ν΄λμ€μ λ§μ°¬κ°μ§λ‘ μΈν°νμ΄μ€ λν λ΄λΆμλ ꡬνλ μ½λ(λ©μλλ μΈμ€ν΄μ€ νλ)κ° μκΈ° λλ¬Έμ μΈν°νμ΄μ€ κ·Έ μ체λ‘λ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μκ³ , μΈν°νμ΄μ€μ λν ꡬν체λ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
μΈν°νμ΄μ€ μ μΈ
1. μλ°μμ μΈν°νμ΄μ€λ₯Ό μ μΈν λλ 'interface' μμ½μ΄ μ¬μ©, ꡬν체μμλ μμμ 'extends'κ° μλ 'implements' μμ½μ΄λ₯Ό μ¬μ©ν©λλ€.
public interface Car {
}
public class Suv implements Car{
}
- λ¨, μΈν°νμ΄μ€κ°μ μμμμλ extends ν€μλ μ¬μ©
2. μΈν°νμ΄μ€λ μΈν°νμ΄μ€λ‘λΆν°λ§ μμλ°μ μ μκ³ , ν΄λμ€μλ λ¬λ¦¬ λ€μ€ μμμ΄ κ°λ₯
public interface Car extends Navigation, MusicPlayer{
public static final String name = "μλμ°¨";
abstract void start();
void stop();
String ModelName();
}
3. μΈν°νμ΄μ€μλ ꡬ체μ μΈ λμμ μμ±ν μ μκ³ , μ€λ‘μ§ μμμ μΆμ λ©μλλ§ μ¬μ©ν μ μμ΅λλ€. (JDK 1.8 μ΄μ )
public interface Car {
public static final String name = "μλμ°¨";
public static final int wheel = 4;
default void openWindow() { // After JDK 1.8 ver
System.out.println("μ°½λ¬Έ μ΄κΈ°");
}
static int getWheel() { // After JDK 1.8 ver
return wheel;
}
abstract void start();
void stop();
String ModelName();
}
- JDK 1.8 λ²μ μ΄μ μμλ μΈν°νμ΄μ€μλ μμ(static final)μ μΆμ λ©μλ(abstract method)λ§ μ¬μ©ν μ μμμ΅λλ€.
- JDK 1.8 λ²μ μ΄νμλ static λ©μλμ default λ©μλ μ¬μ©μ΄ κ°λ₯νκΈ΄ νμ§λ§, JDK 1.8 λ²μ μ΄μ κΈ°μ€μΌλ‘ ν΅μ©νκ² μ΅λλ€.
- default λ©μλλ₯Ό ν΅ν΄ 곡ν΅μ μΌλ‘ λ€μ΄κ° κΈ°λ₯μ ꡬνν μ μμ΅λλ€.
- μΆμ λ©μλ μ μΈ μ abstract ν€μλλ μλ΅ν μ μμ΅λλ€. ( μ»΄νμΌ μ μλμΌλ‘ μμ± )
- λ©€λ² λ³μ μ μΈμ public static final λν μλ΅ κ°λ₯ ( μ»΄νμΌ μ μλμΌλ‘ μμ± )
- μΈν°νμ΄μ€λ μΈμ€ν΄μ€κ° μ‘΄μ¬ν μ μκΈ° λλ¬Έμ μμλ°μ ꡬν κ°μ²΄μμ κ°μ μνλ₯Ό 보μ₯νκΈ° μν΄μ public static finalμ μ¬μ©ν©λλ€.
public class Suv implements Car{
private String modelName;
@Override
public void start() {
System.out.println("μλμ΄ μΌμ‘μ΅λλ€.");
}
@Override
public void stop() {
System.out.println("μλμ λλλ€.");
}
@Override
public String ModelName() {
return name + this.modelName;
}
}
μΆμ ν΄λμ€μ μΈν°νμ΄μ€ λΉκ΅
곡ν΅μ
- μΆμ λ©μλλ₯Ό κ°μ§λλ€.
- κ·Έ μμ²΄λ‘ μΈμ€ν΄μ€ μμ±μ΄ λΆκ°λ₯νκ³ μμ/ꡬνν ν΄λμ€λ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
- μΈν°νμ΄μ€μ μΆμν΄λμ€μ ꡬν, μμ ν΄λμ€λ μΆμ λ©μλλ₯Ό λ°λμ ꡬννμ¬μΌ ν©λλ€.
μ°¨μ΄μ
- μΆμ ν΄λμ€λ extends ν€μλλ₯Ό ν΅ν μμ, μΈν°νμ΄μ€λ implements ν€μλλ₯Ό ν΅ν ꡬνμ΄ μ΄λ£¨μ΄μ§λλ€.
- μΆμ ν΄λμ€λ λ©€λ² λ³μ, μμ±μ, μΌλ° λ©μλ, μΆμ λ©μλ λͺ¨λ κ°μ§ μ μμ§λ§, μΈν°νμ΄μ€μμλ μμμ μΆμ λ©μλλ§ κ°μ§ μ μκ³ , μμ±μμ λ©€λ² λ³μλ₯Ό κ°μ§ μ μμ΅λλ€.
- μΆμ ν΄λμ€λ λ€μ€ μμμ΄ λΆκ°λ₯ νμ§λ§, (νμ΄μ ν΄λμ€λ λ€μ€ μμμ΄ λΆκ°λ₯) μΈν°νμ΄μ€λ μΈν°νμ΄μ€λΌλ¦¬ λ€μ€ μμμ΄ κ°λ₯ν©λλ€.
- μ΄ λμ μ΄ 'λ€μ€ μμ' μ¬λΆμ λ°λ₯Έ μ°¨μ΄κ° μμ§λ§, μ΄ κΈ°λ₯μ μ¬λΆλ‘ μΈν΄ μ¬μ© λͺ©μ μ΄ κ°λ¦¬λ κ²μ μλ
μΈμ μΆμν΄λμ€λ₯Ό μ¬μ©νκ³ μΈμ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλκ°?
μΆμ ν΄λμ€λ ꡬνμ ν΅ν΄ νμ ν΄λμ€μμ 곡ν΅μΌλ‘ μ¬μ©νλ λ©€λ²λ€μ μμ μΆμ ν΄λμ€μ λ©μλλ‘ ν λ²λ§ ꡬνν¨μΌλ‘μ¨ νμ ν΄λμ€μμμ λΆνμν μ½λ μ€λ³΅μ λ°©μ§νλλ‘ μλλ ν΄λμ€μ λλ€.
- μ€λ³΅ λ©€λ²λ₯Ό ν΅ν©νκ³ μ ν λ
public class Cat{
private String type; // μ€λ³΅ λ©€λ²
private int wakeUpHour; // μ€λ³΅ λ©€λ²
public Cat(String type) {
this.type = type;
}
public void bark() {
System.out.println("This Cat howl like " + this.type);
} // μ€λ³΅ λ©€λ²
public void sleep() {
System.out.println("Sleeping..");
} // μ€λ³΅ λ©€λ²
}
public class Dog {
private String type; // μ€λ³΅ λ©€λ²
private int wakeUpHour; // μ€λ³΅ λ©€λ²
public Dog(String type) {
this.type = type;
}
public void bark() { // μ€λ³΅ λ©€λ²
System.out.println("This puppy barks like " + this.type);
}
public void sleep() {
System.out.println("Sleeping..");
} // μ€λ³΅ λ©€λ²
}
μ μ½λμ Catκ³Ό Dog ν΄λμ€λ μ€λ³΅ λ©€λ²λ₯Ό κ°κ³ μμ΅λλ€. (νλλ‘ λ³΄λ©΄ type, wakeUppHour, λ©μλλ‘ λ³΄λ©΄ bark(), sleep())
μ΄ λ μλμ κ°μ΄ μ€λ³΅ λ©€λ²λ₯Ό μμ ν΄λμ€λ‘ λ¬Άκ³ λ©μλλ ν΅ν©νλ©° μΆμνλ₯Ό ν΄μ£Όλ©΄ λμ€μ λ€λ₯Έ μ’ λ₯μ ν΄λμ€λ₯Ό μΆκ°, νμ₯ν¨μ μμ΄ μ μ°νκ³ κ΅¬μ‘°μ μΈ κ°μ²΄ μ§ν₯ μ€κ³λ₯Ό λ§λ€ μ μκ² λ©λλ€.
abstract class Animal {
String type;
int wakeUpHour;
public abstract void bark();
public void sleep() {
System.out.println("Sleeping...zZZ");
}
}
public class Dog extends Animal {
public Dog(String type) {
this.type = type;
}
public void bark() { // μ€λ³΅ λ©€λ²
System.out.println("This puppy barks like " + this.type);
}
}
public class Cat extends Animal{
public Cat(String type) {
this.type = type;
}
public void bark() {
System.out.println("This Cat howl like " + this.type);
} // μ€λ³΅ λ©€λ²
}
- ν΄λμ€κ° κ³μΈ΅ ꡬ쑰λ₯Ό λͺ ννκ² μ€κ³ν λ
λν ν΄λμ€ λΌλ¦¬ λͺ νν κ³μΈ΅ κ΅¬μ‘°κ° νμν λλ μΆμ ν΄λμ€λ₯Ό μ¬μ©ν©λλ€.
μ΄λ₯Ό ν λ©΄ 리μμ€μ Ownerμ΄κ±°λ λλ κΆνμ΄ ADMINμΈμ§ κ²μ¬νλ ν΄λμ€λ₯Ό λ§λλ €κ³ ν©λλ€. μ΄ λ μ΄λ€ 리μμ€μ λν κ²μ¬λ₯Ό ν κ² μΈμ§μ μμ± νκΈ° μ , μΆμ ν΄λμ€μ κ³΅ν΅ λΆλͺ¨λ€μ νν(check(), hasAuthority()) νκ³ , μμμ ν΅ν΄ μ¬λ¬ Guard ν΄λμ€λ₯Ό νμ₯ν΄λκ°μΌλ‘μ¨ μμ Guard μΆμ ν΄λμ€μ νμ ν΄λμ€ (PostGuard, CommentGuard) κ°μ μλ―Έμλ μ°κ΄κ΄κ³λ₯Ό ꡬμΆν μ μμ΅λλ€.
// ν΄λΌμ΄μΈνΈλ₯Ό κ²μ¬νλ μΆμνλ μ½λ
public abstract class Guard {
public final boolean check(Long id){ // λ‘κ·ΈμΈ νμκ³ , idμ λν 리μμ€ κΆνμ΄ μλμ§ κ²μ¬
return SecurityUtil.isAuthenticated() && hasAuthority(id);
}
private boolean hasAuthority(Long id){ // ADMINμ΄κ±°λ, ν΄λΉ 리μμ€μ OwnerμΈμ§ κ²μ¬
return SecurityUtil.extractMemberRolesFromContext().contains(RoleType.ADMIN) || isResourceOwner(id);
}
abstract protected boolean isResourceOwner(Long id);
}
public class CommentGuard extends Guard {
private final CommentRepository commentRepository;
@Override
protected boolean isResourceOwner(Long id) {
Comment comment = commentRepository.findById(id).orElseThrow(GuardException::new);
return comment.getId().equals(id);
}
}
public class PostGuard extends Guard {
private final PostRepository postRepository;
@Override
protected boolean isResourceOwner(Long id) {
Post post = postRepository.findById(id).orElseThrow(GuardException::new);
Long memberId = Long.valueOf(SecurityUtil.getCurrentUserId().orElseThrow(GuardException::new));
return post.getMember().getId().equals(memberId);
}
}
μΆμ ν΄λμ€λ μ΄λ κ² λ°μ νκ² κ΄λ ¨λ ν΄λμ€λ€λΌλ¦¬ μ½λλ₯Ό 곡μ ν λ 미리 λ Όλ¦¬μ μΈ ν΄λμ€ μμ ꡬ쑰λ₯Ό λ§λ€μ΄ λκ³ μ¬μ©μ΄ κ²°μ λλ λλμ΄λΌλ©΄ (μμμ ν΅ν΄ νμ ν΄λμ€λ‘ μμ λ€μ κΈ°λ₯μ νμ₯ μμΌκ°λ λλ, Guard -> PostGuard, CommentGuard)
μΈν°νμ΄μ€λ λ°λλ‘ κ΄λ ¨μ±μ΄ μμ§λ§ κ°μ μ±κ²©μ μ§λ ν΄λμ€λ€λΌλ¦¬ κ΄κ³λ₯Ό λ§Ίμ΄μ€ λ, νμμ λ°λΌ μμ λ‘κ² λΆμλ€ λΌμλ€νλ λλμΌλ‘ λ³Ό μ μμ΅λλ€. (μΈν°νμ΄μ€μ μ μλ λ©μλλ₯Ό κ° ν΄λμ€μ λͺ©μ μ λ§κ² κΈ°λ₯μ ꡬννλ λλ)
μ μμ κ΄κ³λκ° μλ€κ³ κ°μ ν©μλ€. μ½λλ‘ νννλ©΄
abstract class Creature {
}
abstract class Plants extends Creature{
}
public class Carrot extends Plants{
}
public class Tree extends Plants{
}
public class Potato extends Plants{
}
abstract class Animal extends Creature{
}
public class Cow extends Animal {
}
public class Pig extends Animal{
}
public class Monkey extends Animal{
}
μ΄ λ, Eatable λ©μλλ₯Ό Carrotκ³Ό Potato, Cowμ Pig ν΄λμ€μ μΆκ°νλ €κ³ ν©λλ€.
μ΄ λ©μλλ₯Ό Creature μΆμ ν΄λμ€μ μΆκ°νκ² λλ©΄, λ¨Ήμ μ μλ Tree, Monkey ν΄λμ€μλ λ°λμ μΆμ λ©μλλ₯Ό μΆκ°νκ³ κ΅¬νν΄μΌνλ κ°μ μ±μ΄ μκΈ°κ² λ©λλ€. (λ무μ μμμ΄λ λ¨Ήμ μ μλ€κ³ κ°μ )
abstract class Creature {
public abstract void eatable();
}
abstract class Plants extends Creature{
}
public class Carrot extends Plants{
@Override
public void eatable() {
System.out.println("EAT");
}
}
public class Tree extends Plants{
@Override
public void eatable() {
}
}
public class Potato extends Plants{
@Override
public void eatable() {
System.out.println("EAT");
}
}
abstract class Animal extends Creature{
}
public class Cow extends Animal {
@Override
public void eatable() {
System.out.println("EAT");
}
}
public class Pig extends Animal{
@Override
public void eatable() {
System.out.println("EAT");
}
}
public class Monkey extends Animal{
@Override
public void eatable() {
}
}
λ©μλλ₯Ό μ μΈνκΈ°λ§ λΉμΉΈμΌλ‘ λλλ©΄ λκΈ°λ νμ§λ§, κ°μ²΄ μ§ν₯ μ€κ³μ μλ°λ λΏλ§ μλλΌ λμ€μ μ μ§λ³΄μ λ©΄μμλ μ’μ§ μμ΅λλ€.
λ°λΌμ μ΄ λ μ κ·Έλ¦Όκ³Ό κ°μ΄ μμμ μ½λ§€μ΄μ§ μλ μΈν°νμ΄μ€μ μΆμ λ©μλλ₯Ό μ μΈνκ³ μ΄λ₯Ό ꡬννλ©΄μ μμ λ‘μ΄ νμ λ¬Άμμ ν΅ν΄ μΆμνλ₯Ό μ΄λ£° μ μμ΅λλ€.
abstract class Creature {
}
public interface Eatable {
public void eatable();
}
// Plants
abstract class Plants extends Creature{
}
public class Carrot extends Plants implements Eatable{
@Override
public void eatable() {
System.out.println("EAT CARROT");
}
}
public class Potato extends Plants implements Eatable{
@Override
public void eatable() {
System.out.println("EAT POTATO");
}
}
public class Tree extends Plants {
}
// Animal
abstract class Animal extends Creature{
}
public class Cow extends Animal implements Eatable {
@Override
public void eatable() {
System.out.println("EAT COW");
}
}
public class Pig extends Animal implements Eatable {
@Override
public void eatable() {
System.out.println("EAT PIG");
}
}
public class Monkey extends Animal{
}
μ΄λ κ² μΆμ ν΄λμ€μ λ€νμ±μ΄λ μΈν°νμ΄μ€μ λ€νμ± λͺ¨λ ν΄λμ€μ νμ μ ν΅ν©νλ€λ μλ―Έλ λμΌν©λλ€λ§, μΈμ μ΄λ μν©μ 'λ€νμ±'μ μ¬μ©νλλμ λ°λ₯Έ μμ μ°¨μ΄λ‘ μΈν΄ μ΄λκ²μ μ¬μ©νλλκ° κ°λ¦°λ€κ³ λ³Ό μ μμ΅λλ€.
μ‘°κΈ μ΄λ‘ μ μΈ λλλ κ°ν©λλ€λ§, λ§μ μ½λλ₯Ό μ νλ©΄μ κΉ¨λ¬μμΌ μλΏμ κ² κ°μ΅λλ€.
<μ 리>
abstract classλ₯Ό μ¬μ©ν λ
- νμ ν΄λμ€κ° μ€λ²λΌμ΄λ© λ° μ¬μ μ νλ κΈ°λ₯λ€μ 곡μ νκΈ° μν μμ κ°λ μ μ¬μ©ν λ
- μꡬμ¬νκ³Ό ν¨κ» ꡬν μΈλΆ μ 보μ μΌλΆ κΈ°λ₯λ§ μ§μ νμ λ
- μΈμ€ν΄μ€ μνλ₯Ό λ³κ²½νκΈ° μν non-final / non-static λ©μλκ° νμν κ²½μ°
- is - A κ΄κ³μΌ λ ("~μ΄λ€" μ κ΄κ³)
- λ©€λ²μ public μ΄μΈμ μ κ·Όμ(protected, private)κ° μ¬μ©λλ κ²½μ°
interfaceλ₯Ό μ¬μ©ν λ
- μλ‘ κ΄λ ¨μ±μ΄ μλ ν΄λμ€λΌλ¦¬ κ΄κ³λ₯Ό λ§Ίμ΄μ€ λ (νμ κ΄κ³, νΉμ μ±μ§μ κ°μ§κ³ μλ has - A κ΄κ³)
- νΉμ λ°μ΄ν° νμ μ λμμ μ§μ νλ €κ³ νμ§λ§ ν΄λΉ λμμ λκ° κ΅¬ννλμ§ μ€μνμ§ μμ κ²½μ°
- λ€μ€ μμμ΄ νμν κ²½μ°
- has - A κ΄κ³μΌ λ ("~μ κ°μ§κ³ μλ€")
<μ°Έκ³ μλ£>
'π Backend > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] λ΄λΆ ν΄λμ€(Inner class)μ λν΄ (0) | 2023.10.03 |
---|---|
[Java] μΈν°νμ΄μ€λ₯Ό μ΄μ©ν λ€νμ±κ³Ό νμ© (1) | 2023.10.02 |
[Java] λ€νμ±(Polymorphism)μ λν΄ (0) | 2023.09.27 |
[Java] μμ(Inheritance)μ λν΄ (1) | 2023.09.27 |
[Java] String Constant poolκ³Ό Heap μμμ λν΄ (0) | 2023.09.26 |
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422