728x90

M => Model : 프로그램의 Logic

- 디자인 패턴의 한 형태

- 데이터를 전달/저장

V => View : Model단계를 표현하기 위해

사용자 인터페이스(UI) 제공.

- 사용자에게 보여지는 부분(출력문, 사용자가 입력하는 화면)

C => Controller : Model 단계/View단계 사이에 존재/ 이둘 중재자 역할

모델과 뷰 사이에 껴서 서로 통신을 할 수 있도로 가운데에서 중간 다리 역할을 하는 곳,

뷰에서 요청하면 컨트롤러에서 받아 모델에게 전달한 뒤 값을 다시 컨트롤러에서 받아 뷰로 간다.

 

MusicVO.java

package MP3plyaer;

public class MusicVO {
		
		// VO - 한개 또는 그 이상의 속성을 묶어서 특정 값을 나타내는 객체
		// MVC Pattern - Model	
	
		// 필드 구성
		private String title;// 노래 제목 -> title
		private String singer;// 가수 이름 -> singer
		private int playTime;// 재생 시간 -> playTime
		
		// 생성자
		public MusicVO(String title, String singer, int playTime) {	
			this.title = title;
			this.singer = singer;
			this.playTime = playTime;
		}
		
		
		// Getter, Setter 메소드
		// Getter : 조회
		// Setter : 수정
		
		public String getTitle() {
			return title;
		}
		public void setTitle(String title) {
			this.title = title;
		}
		public String getSinger() {
			return singer;
		}
		public void setSinger(String singer) {
			this.singer = singer;
		}
		public int getPlayTime() {
			return playTime;
		}
		public void setPlayTime(int playTime) {
			this.playTime = playTime;
		}

		@Override
		public String toString() {
			String string = "제목: " + this.title + "\t"
					+ "가수 : " + this.singer + "\t"
					+ "시간 : " + this.playTime + "\t";
			return string;
		}		
}

MusicController.java

package MP3plyaer;

import java.util.ArrayList;

public class MusicController {
	
	ArrayList<MusicVO> list = new ArrayList<>();
	
	// 음악 등록 해주는 메소드
	public void insertMusic(String title, String singer, int playTime) {
		// 이 매개변수들을 전부 생성자 넣어주기
		MusicVO mvo = new MusicVO(title, singer, playTime);
		// 생성자 담고난 뒤에 리스트에 추가
		list.add(mvo);
	}
	
	// 음악 목록 보여주는 메소드
	public void showMusic() {
		System.out.println("============노래 목록==============");
		for(int i=0; i<list.size(); i++) {
			System.out.println((i+1)+", 제목 : " + list.get(i).getTitle()+"\t"
					+", 가수 : " + list.get(i).getSinger()+"\t"
					+", 시간 : "+list.get(i).getPlayTime()+"초");
		}
	}
	
	// 음악 재생 하는 메소드
	public void play(int i) {
		System.out.println("============노래 실행==============");
		System.out.println((i+1)+", 제목 : " + list.get(i).getTitle()+"\t"
				+", 가수 : " + list.get(i).getSinger()+"\t"
				+", 시간 : "+list.get(i).getPlayTime()+"초");
	}
	
	// List 불러오는 메소드
	public ArrayList<MusicVO> getList(){
		return list;
	}	
}

Main.java

package MP3plyaer;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import javazoom.jl.player.MP3Player;

public class Main {
	//MVC Pattern - view
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		MusicController mc = new MusicController();
		MP3Player mp3 = new MP3Player();
		int menu = 0;
		int i = 0;

		while (true) {
			System.out.println("=============뮤직 플레이어=================");
			System.out.print("1.등록 2.목록 3.실행 4.이전곡 5.다음곡 6.종료 >> ");
			menu = sc.nextInt();
			if (menu == 6) {
				System.out.println("종료되었습니다.");
				break;
			} else if (menu == 1) {
				System.out.println("=============등록=================");
				System.out.print("제목 : ");
				String title = sc.next();
				System.out.print("가수 : ");
				String singer = sc.next();
				System.out.print("시간 : ");
				int playTime = sc.nextInt();
				mc.insertMusic(title, singer, playTime);
			} else if (menu == 2) {
				ArrayList<MusicVO> list = mc.getList();
				if (list.size() == 0) {
					System.out.println("목록이 비어있습니다. ");
				} else {
					mc.showMusic();
				}
			} else if (menu == 3) {
				ArrayList<MusicVO> list = mc.getList();
				if (list.size() == 0) {
					System.out.println("실행할 곡이 없습니다. ");
					break;
				} else {
					mc.play(i);
				}
			} else if (menu == 4) {
				ArrayList<MusicVO> list = mc.getList();
				if (list.size() == 0) {
					System.out.println("재생할 곡이 없습니다. ");
					break;
				} else if (list.size() == 1) {
					System.out.println("곡이 하나입니다. ");
					break;
				}
				if (i == 0) {
					i = list.size() - 1;
					mc.play(i);
				} else {
					i -= 1;
					mc.play(i);
				}
			} else if (menu == 5) {
				ArrayList<MusicVO> list = mc.getList();
				if (list.size() == 0) {
					System.out.println("재생할 곡이 없습니다. ");
					break;
				} else if (list.size() == 1) {
					System.out.println("곡이 하나입니다. ");
					break;
				}
				if (i == list.size() - 1) {
					i = 0;
					mc.play(i);
				} else {
					i += 1;
					mc.play(i);
				}
			}
		}
	}
}

■ 상속

 

상속 : 기존의 클래스의 변수(데이터)와 메서드(로직,
코드)를 물려받아서 새로운 클래스를 구성하는 것

상속에서 화살표방향이 자식 ---> 부모
: 메서드,필드를 찾아가는 방향, 
: 데이터를 탐색해나가는 방향 

상속의 키워드 : extends
( class 자식클래스명 extends 부모클래스명 )
상속의 특징

1. 다중 상속이 불가능하다. 
2. 상속의 횟수에 제한을 두지 않는다.
3. 모드 클래스는 Object를 상속받는다!!

메서드 오버라이딩 (재정의) ----> 다형성
: 상속받은 클래스에서 (자식클래스) 부모클래스의
메서드를 재정의하는 것 
>>메서드 오버로딩(중복정의)
: 한 클래스 내에서 메소드를 중 복 정의하는 것

 

상속의 특징

1. 자바에서는 다중 상속을 지원하지 않는다. 1개의 상속만!

(extends 클래스명(단 1개)

2. 자바에서는 상속 횟수에 제한 두지 않는다. 무한상속 가능!

3. 모든 클래스의 최상위 클래스는 java.lang.Object 클래스이다.

 

● 오버라이딩(재정의)

● 오버로딩(중복정의)

오버라이딩의 조건(재정의)

- 상속 관계에서 매개변수,매서드명 동일!

- 메소드 이름이 같아야 한다.

- 메소드 매개변수의 개수와 데이터 타입이 같아야 한다.

- 메소드의 리턴 타입이 같아야 한다.

 

오버 로딩의 조건 (중복정의)

- 같은 클래스내에 

-  메소드의 이름은 같다.

-  메소드의 매개변수, 데이터 타입은 달라야 한다.

 

● 캐스팅

1. 업캐스팅

자식클래스에서 부모클래스로 형변환 해주는 것

==> 하위클래스가 상위클래스 타입으로 자동 형변환

객체 안에 있는 모든 변수, 메소드에 접근 불가

==> 상위 클래스 안에 있는 변수, 메소드에만 접근 가능

하위 클래스 에서 상위 클래스의 메소드를 오버라이딩 한 경우

하위 클래스의 메소드 호출한다

 

2. 다운캐스팅

부모클래스에서 자식 클래스

=> 업캐스팅을 취소

=> 업캐스팅 된 것을 강제적으로 타입 변환을 하여 다시 되돌려 놓는 것.

 

● 추상화

클래스간의 공통점을 찾아내서 공통의 조상을
만드는 작업. 
상속 계층도를 따라 올라갈수록 클래스의 
추상화는 더욱 심화된다. 
(구체화 - 상속을 통해 클래스 확장 extends)

**추상메서드
: 선언은 되어 있으나 구현되어 있지 않은 메소드
(추상 메서드 선언
   : abstract
   : ex) public abstract int getValue();
추상 메서드는 서브 클래스에서 오버라이딩하여 구현

**추상 클래스(abstract class)
: 추상 메서드를 하나라도 가진 클래스
( 클래스 앞에 반드시 abstract라고 선언해야 함)

질문. 클래스에 추상메서드가 없어도 추상 클래스로
만들 수있을까???
: 추상메서드가 하나도 없지만 클래스 앞에abstract
로 선언할수 있습니다. 없어도 가능해요.

추상클래스 --->개념적인 존재
상속하는 용도로 사용되는 설계도
** 추상클래스의 객체를 생성할 수 없다.

추상 클래스의 필요성
1) 상속관계에서 서브클래스(자식)가 반드시
구현해야함을 알릴때 (강제성)
2) 설계와 구현 분리
3) 수퍼 클래스(부모)에서는 개념적 특징 정의
4) 서브 클래스(자식) 구체적 행위 구현 

즉, 추상클래스는 객체화가 불가능-> {} 구현되지않은 불안정한 클래스(설계도)

 추상메서드(abstract method) : 선언은 되어있으나 구현이 되어 있지 않은 메서드
 public abstract 리턴타입 메서드명(매개변수);
 자식클래스에서 오버라이딩을 통해 구현된 메서드이다!

 추상클래스(abstract class)
 추상메서드가 하나라도 포함되어 있으면 일반클래스를 추상클래스로 만들어줘야한다
 추상메서드 없어도 추상클래스를 만들 수 있다.

 추상클래스 ---> 개념적인 존재
 상속하는 용도로만 사용되는 설계도
 추상 클래스의 객체는 생성할 수 없다

 

추상클래스 예제)

package 월급계산프로그램;

public class RegularEmployee extends Employee {
	
	int bonus;
	
	public RegularEmployee(String empno, String name, int pay, int bonus) {
		this.empno = empno;
		this.name = name;
		this.pay = pay;
		this.bonus = bonus;
	}
	// getMoneyPay : 리턴타입 int, 매개변수X
	@Override
	public int getMoneyPay() {
		return (pay+bonus)/12;
	}
	// print
	// Employee에 있는 print() 사용 
}

package 월급계산프로그램;

public class TempEmployee extends Employee {
	
	public TempEmployee(String empno, String name, int pay) {
		this.empno = empno;
		this.name = name;
		this.pay = pay;
	}
	@Override
	public int getMoneyPay() {
		return pay/12;
	}
	
}

package 월급계산프로그램;

public class PartTimeEmployee extends Employee {
	
	
	int workDay;
	
	public PartTimeEmployee(String empno, String name, int pay, int workDay) {		
		this.empno = empno;
		this.name = name;
		this.pay = pay;
		this.workDay = workDay;
	}
	@Override
	public int getMoneyPay() {
		return pay*workDay;
	}
}

package 월급계산프로그램;

public class Main {

	public static void main(String[] args) {
		// regular객체 생성과 동시에 초기화 진행 (기본생성자는 사용 불가능)
		RegularEmployee regular = new RegularEmployee("SMHRD001", "홍길동", 4000, 400);
		// 사원정보 출력
		System.out.println(regular.print());
		// 사원의 월급 --> getMoneyPay() : 월급을 구하는 메서드
		System.out.println(regular.getMoneyPay()+"만원");
		
		TempEmployee temp = new TempEmployee("SMHRD002","박문수",3000);
		System.out.println(temp.print());
		System.out.println(temp.getMoneyPay()+"만원");
		
		PartTimeEmployee partTime = new PartTimeEmployee("SMHRD003", "임성훈", 10, 10);
		System.out.println(partTime.print());
		System.out.println(partTime.getMoneyPay()+"만원");
	}
}

추상클래스 코드

package 월급계산프로그램;

public abstract class Employee {
	
	// Regular, Temp, partTim이 가직 공통적인 필드, 메서드
	// Employee를 상속받게 만들자
	
	// 사번, 이름, 연봉(pay)
	String empno;
	String name;
	int pay;
	
	// getMoneyPay()
	// {}--> 각각 다르게 구현되어있다. 
	public abstract int getMoneyPay();
	// print()
	public String print() {
		return empno+" : "+name+" : "+pay;
	}
	// 일반 클래스는 추상 메서드 가질 수 없다
	// 추상 클래스는 일반 메서드 가질 수 있다 
    // 다형성!
}

구문에 오류가 없다-> 신뢰성이 있다

 

■ 인터페이스

// 인터페이스
   // 추상클래스와 비슷한 개념을 : 바디를 가지고있는 메서드 + 추상메서드 포함할수 있다.
   // 인터페이스는 모두 바디가 없는(구현이 되어있지 않은) 메서드만을 포함한다.
   // 진정한 설계도
   
   // 1) 인터페이스는 다중상속이 가능하다. 
   // 2) 작업명세서 or 프로젝트 설계도 (찐 설계도!!!!!)
   // 3) 기능만 정의함으로써 구현 객체 같은 동작 보장(구현 강제)
   // 단, 같은 타입, 같은이름 메서드로 구현해합니다. (오버 라이딩-> 재정의)
   
   // 인터페이스 예 ) JDBC
   // : Java와 DB를 연결하는 API (Application Programming Interface)

인터페이스 특징

추상과 비슷한 개념

추상클래스 : 일반메서드 + 추상메서드 포함할 수 있다

인터페이스 : 모두 바디가 없는 메서드를 포함한다

==> 진짜 설계도, 작업명세서, 프로젝트 설계도

필드 가질 수 있는데 무조건 상수 형태로만 존재해야 한다!

==> final int number = 7;

 

PS. 이부분을 확실하게 해야 JDBC에서 어렵지 않을 것이다! 확실하게 짚고 넘어가자!

728x90
복사했습니다!