![article thumbnail image](https://blog.kakaocdn.net/dn/mBXbC/btrMWecxqRI/yIi9lHskLKv9QZQSGASgW1/img.png)
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에서 어렵지 않을 것이다! 확실하게 짚고 넘어가자!
'Study > JAVA' 카테고리의 다른 글
JAVA기초 15일차 <JDBC> JavaDatabaseConnectivityAPI (0) | 2022.09.27 |
---|---|
JAVA기초 13일차 <arraylist> (1) | 2022.09.24 |
JAVA기초 12일차 <객체지향2> (0) | 2022.09.24 |
JAVA기초 11일차 <객체지향> (1) | 2022.09.24 |
JAVA기초 10일차 <메서드> (0) | 2022.09.24 |