[21.07.19] interface

yed·2021년 7월 19일
0

자바는 틀을 잘 만들어서 공장을 가동하는 형식이라고 생각해봅시다.


abstract

추상적인, 실체가 없는이라는 뜻으로 반드시 정의되어야 하는 메소드의 프로토타입만 선언해놓고 틀을 공유하는 형식이라고 할 수 있어요.

abstract 클래스

abstract class 클래스이름{ 본문 }

추상 메소드를 하나라도 가지고있는 클래스를 의미합니다. 추상 클래스는 생성자 호출이 불가능해서 인스턴스를 생성할 수 없어요. 하지만 추상 클래스를 상속받은 자식 클래스에서 추상 메소드를 override하고 인스턴스를 생성하면 추상클래스의 생성자도 호출이 됩니다!
추상메소드를 가진 클래스를 상속받는 자식 클래스에선 추상메소드의 본체를 꼭 구현해줘야합니다. 자식 클래스를 통해서 비로소 완벽한 클래스가 되는 게 추상클래스라고 할 수 있겠네요

abstract 메소드

수식어 abstract 리턴타입 메소드이름(매개변수1, 매개변수2, ...);

메소드의 원형(리턴 타입, 이름, 매개변수)만 선언하고 메소드의 본체를 구현하지 않는 메소드입니다. 추상메소드는 상속받은 자식 클래스가 반드시 override해야하는 메소드예요.

interface

다른 클래스들의 중간매개체가 되면서 여러개의 특성을 한번에 가져야 할 때 사용하는게 interface 키워드입니다. 인터페이스는 추상메소드만 사용하거나 상수만 사용하여 사용할 클래스들의 기본 형태를 정의할 때 사용해요.

  • interface 규칙
  1. 모든 메소드public abstract로 선언. [수식어 생략가능]
  2. 모든 멤버변수public static final로 선언. [수식어 생략가능]
  3. 선언 시 interface 키워드 사용.
  4. 인터페이스를 구현하는 클래스는 implements 키워드 사용.
  5. 인터페이스를 구현하는 수는 제한 없음
    ex) class Child implements Inter1, Inter2 ..(o)
  6. 인터페이스와 인터페이스끼리의 implements(구현)는 불가능하고 extends(상속)은 가능.
  7. 인터페이스를 클래스에게의 implements(구현)만 가능.
  8. 인터페이스는 객체생성 자체가 불가능.

추상 클래스를 상속받아 사용하는 것과 인터페이스를 구현하는 것처럼 둘의 용도는 비슷해요!
차이점은 인터페이스는 아예 틀을 만들기 위해서 만들어졌다는 점입니다. 그래서 추상클래스는 상속을 이용하기 때문에 다중상속이 불가능하지만 인터페이스는 여러 개의 인터페이스를 동시에 구현(implements)할 수 있답니다 기능의 틀을 만들기 위해서라면 인터페이스를 사용하게 더 효율적이겠어요

extends과 implements의 차이

  • 상속(extends)은 IS-A 관계
    ex) smartTv는 tv다.
  • 구현(implements)은 HAS-A 관계
    ex) (에어컨 or tv)은(는) 리모컨을 가지고 있다.

interface의 다형성

에어컨과 TV는 리모컨을 가지고 있습니다.

RemoteControl rc1=new Tv();
RemoteControl rc2=new AirCon();

이처럼 구현된 클래스(Tv/AirCon)의 객체를 인터페이스 타입의 참조 변수(RemoteControl)에 저장할 수 있어요. 이또한 강제 형변환으로 구현된 클래스의 메소드들을 사용할 수 있답니다


MVC 패턴

model-view-controller의 약자인 MVC 디자인 패턴은 프로그램을 개발할 때 그 구성요소를 3가지로 분리한 패턴을 의미해요!

보이는 부분인 View와 데이터만 받아오는 Controller, 그리고 View와 Controller를 왔다갔다하는게 Model입니다. 사용자에게 보여지는 시각적인 부분구조적인 데이터 부분이 서로 영향없이 유지보수가 가능하기 때문에 사용한답니다

쉽게 말하자면 Model은 데이터를 담는 틀이라고 생각하면 됩니다. View는 사용자가 쓰는 인터페이스, Controller는 서버와 인터페이스의 중개역할입니다.

(java만 배운 지금 MVC 패턴을 완전히 구현할 순 없어서 이해하기 좀 어려울 수 있어요..! 중요한 부분이기 때문에 우선 가볍게 개념만 짚고 나중에 다시 배워보겠습니다😵)

MVC 패턴을 이용해서 프로그램을 만든다면 어떤식으로 구성해야 하는지 회원관리 프로그램의 틀을 만들어보면서 파악해봅시다!

회원관리 프로그램 ver 1.0 (틀)

  1. 목적 : 회원관리 프로그램
  2. 기능 : interface로 기능의 함수 미리 만듦.

    1) 회원가입(회원 정보 입력)
    2) 회원 전체 검색(회원 정보를 모두 가진 배열의 데이터 출력)
    3)회원 상세 검색(특정 인덱스의 데이터 출력)
    4) 회원 수정(특정 인덱스 데이터 수정)
    5) 회원 탈퇴(배열의 효율성문제로 인한 기능 보류)

  3. 데이터 모델 : 아이디(id). 비밀번호(pw). 이메일(email)

데이터 Model은 어떤 데이터를 받아올것인지 데이터가 이동할 틀을 의미합니다. 개발자마다 순서는 다르지만 저희는 데이터의 틀인 모델을 먼저 만들어볼게요!

VO(value Object) or DTO(Data Transfer Object) : MVC 디자인 패턴에서 Model 클래스. 데이터 모델의 정보 저장하는 클래스

public class MemberVO {
	//멤버 변수
	private String id;
	private String pw;
	private String email;
	//생성자
	public MemberVO() {}
	public MemberVO(String id, String pw, String email) {
		super();
		this.id = id;
		this.pw = pw;
		this.email = email;
	}
	//getter setter
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
	//메소드
	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", pw=" + pw + ", email=" + email + "]";
	}
}

DataBase와 중간역할을 해주는 DAO는 아직 DB를 제대로 배우지 않았기 때문에 interface를 통해 만들어준 틀이 어떤 역할을 하고 데이터가 어떻게 들어오고 어떻게 저장되는지만 알아보겠습니다~ DB를 배우고 이부분이 채워진다면 Controller의 역할을 하겠네요!

MemberDAO(Data Access Object) : 데이터의 전송을 담당하는 역할. 각 기능들의 함수를 정의해 역할 분담. DB연동 시 활용(아직 DB는 배우지 않아서 틀만 정의).

public interface MemberDAO {
	//회원등록. 회원 데이터를 받아올수있는 매개변수 필요
	public abstract int insert(MemberVO vo); 
	//데이터 제어로 데이터를 넣음(리턴타입에 영향)
	
	//전체 회원 검색. 전체 데이터 리스트를 데이터 제어에서 리턴받음. 
	public abstract MemberVO[] select(); 
	//데이터 제어에서 데이터를 가져옴
	//받는 데이터를 리턴타입으로 지정
	
	//특정 인덱스의 상세정보 검색
	public abstract MemberVO select(int index);
	//데이터 제어에서 데이터를 가져옴
	
	//수정. 변경할 데이터 정보를 받아옴.
	public abstract int update(int index, MemberVO vo);
	//데이터 제어에서 데이터를 넣음
}
public class MemberDAOImple implements MemberDAO{
	public MemberDAOImple() {}
	
	public static final int MAX=100; //최대 회원수
	private MemberVO[] list=new MemberVO[MAX];//회원 정보 배열
	private int count; // 배열 저장 데이터 개수
	public int getCount() {
		return count;
	}
	
	@Override
	public int insert(MemberVO vo) {
		//UI 클래스(main)가 전달해준 회원정보 배열에 저장
		return 0;
	}

	@Override
	public MemberVO[] select() {
		//전체 회원 정보(MembeerVO[]) 리턴
		return null;
	}

	@Override
	public MemberVO select(int index) {
		// 선택된 index의 회원 정보(MemberVO) 리턴
		return null;
	}

	@Override
	public int update(int index, MemberVO vo) {
		// 선택된 index의 회원 정보(MemberVO) 수정
		return 0;
	}
}

이제 시각적인 부분인 View 파트만 남았는데요 메뉴만 먼저 간단하게 구성해보겠습니다!

public interface Menu {
	public static final int QUIT=0; //종료
	public static final int INSERT=1; //등록
	public static final int SELECT_ALL=2; //전체검색
	public static final int SELECT_BY_INDEX=3; //상세검색
	public static final int UPDATE=4; //수정
}
public static void main(String[] args) {
	System.out.println("회원 관리 프로그램");
	sc=new Scanner(System.in);
	
	boolean run=true;
	while(run) {
		showMainMenu();
		int choice=sc.nextInt();
		sc.nextLine();
		
		switch (choice) {
		case Menu.QUIT:
			run=false;
			break;
		case Menu.INSERT:
			insertMember();
			break;
		case Menu.SELECT_ALL:
			selectAll();
			break;
		case Menu.SELECT_BY_INDEX:
			selectByIndex();
			break;
		case Menu.UPDATE:
			updateMember();
			break;
		default:
        	System.out.println("다시 선택하세요.");
			break;
		}
	}	
}//end main()

인터페이스에 대해 이해를 높이려면 많이 사용해보는 방법밖에 없다고 느꼈어요 더 많은 예제를 통해 인터페이스와 친숙해져보도록 하겠습니다~

profile
6개월 국비과정 기록하기

0개의 댓글

관련 채용 정보