2021. 04. 08(ネック)TIL



Java


関係です



インタフェース

  • インタフェースは、メソッドがサブクラスに存在する必要があることを強制するために使用される.
  • インタフェースは、すべてのサブクラスの使用方法(方法の実行方法)を統一する標準である.
  • サブクラスは、インタフェースで定義された抽象メソッドの実装(再定義)を担当する.
  • サブクラスは、複数のインタフェースを同時に実装することができる.

  • インタフェースフィーチャー

  • インタフェースは、定数、抽象メソッドから構成される.
  •   public interface Sample {
        public static final 데이터타입 상수명 =;
        public abstract 반환타입 추상메소드명(타입 변수, 타입변수, ...);
      }
  • Java 8のバージョンから、静的メソッドとエラーメソッドが追加されました.
  • インタフェース間で多重継承が可能である.
  • インタフェースで定義されたすべての抽象メソッドには、共通アクセス制限があります.
  • インタフェースで定義されたすべての抽象メソッドは、アクセス制限および抽象キーワードを省略することができる.
  • インタフェースでは、新しいキーワードを使用してオブジェクトを作成できません.
  • インタフェースタイプの参照変数は、サブオブジェクトを参照できます.
  • インタフェースの定義

      public interface Phone {
        // 상수
        public static final String MOBILE_TELECOMMUNICATION = "LTE";
        // 추상 메소드(모든 하위 클래스 반드시 존재해야하는 기능은 추상메소드로 추상화)
        void call();
        void sms();
        // 디폴트 메소드(모든 하위클래스가 동일하게 구현하는 기능은  디폴트 메소드로 인터페이스에서 구현)
        default void on() {
          전원 켜기
        }
        default void off() {
          전원 끄기
        }
      }

    クラスでのインタフェースの実装


  • クラスはimplementsキーワードを使用して実装するインタフェースを指定します.

  • インタフェースの実装
      public interface Calculatable {
        void addNumber(int x, int y);
        int plus();
        int minus();
      }
    
      public class SimpleCalculator implements Calculatable {
        int x;
        int y;
        public void addNumber(int x, int y) {
          this.x = x;
          this.y = y;
        }
        public int plus() {
          return x + y;
        }
        public int minus() {
          return x - y;
        }
      }

  • 1つ以上のインタフェースを実装
      // 모든 하위 클래스가 반드시 포함해야 되는 기능을 정의한 인터페이스
      public interface phone {
        void call();
        void sms();
      }
      // 인증 기능을 지원하는 모든 하위 클래스가 반드시 포함해야 되는 기능을 정의한 인터페이스
      public interface Authenticatable {
        void auth();
      }
      // 인터넷 기능을 지원하는 모든 하위 클래스가 반드시 포함해야 되는 기능을 정의한 인터페이스
      public interface InternetAvailable {
        void web();
      }
    
      // Phone 인터페이스를 구현한 NormalPhone
      public class NormalPhone implements Phone {
        String tel;
        public void call() {
          통화하기
        }
        public void sms() {
          문자보내기
        }
      }
      // NormalPhone 클래스를 상속받고, Authenticatable인터페이스와 IntenetAvailable인터페이스를 구현하는 클래스
      public class SmartPhone extends NormalPhone implements Authenticatable, InternetAvailable {
        String ip;
        public void auth() {
          사용자 인증하기
        }
        public void web() {
          인터넷하기
        }
      }
  • インタフェースの使用

  • インタフェースを使用して、サブクラスの使用方法を統一できます.
  • インタフェースにより、クラス開発者とクラスユーザの連携が容易になります.
  • の開発時間を短縮できます.
  • 標準化可能
  • プロジェクトで使用される実装クラスの基本フレームワーク(基本設計図)をインタフェースとする.
  • 開発者にインタフェースを基本設計図として実装させると、一貫した構造化されたプログラム開発が可能となる.
  • インタフェースを使用すると、クラス間の分散関係を維持できます.
  • クラス間の関係が緩和されると、他のクラスに置き換えると、変更するコードが減少します.

  • package day4;
    
    public class User {
    
    	private String id;
    	private String name;
    	
    	public User () {}
    
    	public User(String id, String name) {
    		this.id = id;
    		this.name = name;
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public String getName() {
    		return name;
    	}
    	
    }
    
    package day4;
    
    public class UserArrayRepository implements UserRepository {
    
    	private User[] db = new User[100];
    	private int position = 0;
    	
    	public UserArrayRepository() {
    		db[position++] = new User("hong", "홍길동");
    		db[position++] = new User("kim", "김유신");
    		db[position++] = new User("lee", "이순신");
    	}
    	
    	@Override
    	public void saveUser(User user) {
    		db[position++] = user;
    		
    	}
    
    	@Override
    	public void removeUser(String id) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void updateUser(User user) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public User getUserById(String id) {
    		User user = null;
    		
    		for (User item : db) {
    			if (item == null) {
    				break;
    			}
    			
    			if (item.getId().equals(id) ) {
    				user = item;
    				break;
    			}
    		}
    		
    		return user;
    	}
    	
    }
    
    package day4;
    
    public class UserFileRepository implements UserRepository {
    
    	@Override
    	public void saveUser(User user) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void removeUser(String id) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void updateUser(User user) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public User getUserById(String id) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	
    }
    
    package day4;
    
    public class UserManager {
    	
    	// 사용자정보 등록 / 삭제 / 변경 / 조회 기능을 제공하는 객체에 대한 표준(인터페이스)사용
    	private UserRepository repo;
    	
    	public void setRepo(UserRepository repo) {
    		this.repo = repo;
    	}
    	
    	public UserManager() {}
    
    	public UserManager(UserRepository repo) {
    		super();
    		this.repo = repo;
    	}
    
    	// 새 사용자 등록하기
    	public void addNewUser(String id, String name) {
    		User savedUser = repo.getUserById(id);
    		if (savedUser != null) {
    			System.out.println("동일한 아이디로 가입한 사용자가 이미 존재합니다.");
    			return; // 메소드 실행 끝내기
    		}
    		User user = new User(id, name);
    		repo.saveUser(user);
    	}
    	
    	// 사용자 정보 삭제하기
    	public void deleteUser(String id) {
    		User savedUser = repo.getUserById(id);
    		if (savedUser == null) {
    			System.out.println("지정된 아이디의 사용자가 존재하지 않습니다.");
    			return;
    		}
    		repo.removeUser(id);
    	}
    	
    	// 사용자 정보 조회하기
    	public User findUser(String id) {
    		User savedUser = repo.getUserById(id);
    		
    		return savedUser;
    	}
    }
    
    package day4;
    
    public class UserManagerApp {
    
    	public static void main(String[] args) {
    		// UserRepository의 구현객체 생성하기
    		UserArrayRepository arrayRepo = new UserArrayRepository();
    				
    		
    		// UserManager객체 생성
    		UserManager userManager = new UserManager();
    		// Setter 메소드를 이용해서 UserRepository구현 객체를 UserManager의 repo변수에 전달하기
    		userManager.setRepo(arrayRepo);
    		
    		System.out.println("### 아이디로 사용자 조회하기");
    		User user1 = userManager.findUser("lee");
    		
    		if ( user1 != null) {
    			System.out.println(user1.getId() + ", " + user1.getName());
    		} else {
    			System.out.println("사용자가 존재하지 않습니다");
    		}
    		
    		System.out.println("## 신규 사용자 등록하기");
    		userManager.addNewUser("park", "박혁거세");
    		
    		System.out.println("### 아이디로 사용자 조회하기");
    		User user2 = userManager.findUser("park");
    		System.out.println(user2.getId() + ", " + user2.getName());
    		
    		// UserManager객체 생성, 생성자 메소드를 이용해서 UserRepository구현객체를 UserManager의
    		// repo 변수에 전달하기
    		UserManager userManager2 = new UserManager(arrayRepo);
    	}
    }
    
    package day4;
    
    public interface UserRepository {
    
    	/**
    	 * 사용자정보를 전달받아서 저장소에 저장한다
    	 * @param user 사용자정보가 저장된 User객체
    	 */
    	void saveUser(User user);
    	
    	/**
    	 * 지정된 아이디의 사용자를 저장소에서 삭제한다
    	 * @param id 삭제할 사용자 아이디
    	 */
    	void removeUser(String id);
    	
    	/**
    	 * 변경된 정보를 포함하고 있는 사용자저보를 전달받아서 저장소에 반영한다
    	 * @param user 변경된 사용자 정보를 포함하고 있는 User객체
    	 */
    	void updateUser(User user);
    	
    	/**
    	 * 지정된 아이디의 사용자 정보를 저장소에서 찾아서 반환한다
    	 * @param id 조회할 사용자 아이디
    	 * @return 사용자정보를 포함하고 있는 User객체
    	 */
    	User getUserById(String id);
    }