일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- visualstudio code
- PHPStorm
- 데이터베이스
- github clone
- error 해결
- error
- jupyter
- 클론
- clone
- localhost
- vscode
- 파이썬
- 따옴표 삭제
- database
- 깃 토큰
- github token
- 단축키
- Python
- php
- csv
- Visual Studio Code
- import data
- console창
- DataGrip
- 오류
- MySQL
- 에러
- cmd
- OrCAD 다운로드
- run sql script
- Today
- Total
개발 노트
7/26 형성(polymorphysm) : OverLoading, OverRiding, return문 주의사항, 호출스택, 기본형, 참조형 매개변수, 기본형 객체형, 주소값, eclipse에서 파일 삭제와 import, Strategy(전략), 디버그 본문
7/26 형성(polymorphysm) : OverLoading, OverRiding, return문 주의사항, 호출스택, 기본형, 참조형 매개변수, 기본형 객체형, 주소값, eclipse에서 파일 삭제와 import, Strategy(전략), 디버그
hayoung.dev 2022. 7. 26. 18:59<개념복습>
[5. 자바 객체 개념]
p.5 속성 = 필드 = 멤버변수p.6 클래스는 객체를 생성하는 형판(설계도)이다. 클래스는 두 개의 구성요소(member)인 자료구조(필드)와 연산(메소드)로 구성되어 있다.
(외우기) 형성(polymorphysm)을 물어보면 OverLoading, OverRiding 말해야 함. 두 개를 비교하는 질문이 나올 수도 있음.
OverLoading : 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라고 한다. 메소드 오버로딩이 필요한 이유는 매개값을 다양하게 받아 처리할 수 있도록 하기 위해서이다.
OverRiding : 메소드 오버라이딩은 상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재정의하는 것을 말한다. 메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 오버라이딩된 자식 메소드가 호출된다. extend나 implements를 이용해서 reuse(재사용하는 것이다)하는 것.
[6. 자바 메서드와 캡슐화]
p.6 return문 주의사항
p.11 JVM의 메모리 구조
p.12 메소드 - 기본형 매개변수와 참조형 매개변수
기본형primitive 매개변수 – 변수의 값을 읽기만 할 수 있다. (read only)
: 기본형을 말함. ex) void add(int a, int b) call by value 방식(값을 전달)
참조형reference 매개변수 – 변수의 값을 읽고 변경할 수 있다. (read & write)
: 객체형을 말함. ex) void add(Integer a, Integer b) call by reference 방식(객체 참조 주소 전달)
(면접에 아주 자주 나오는 문제. 중요함)
기본형(int, long, float, double 등등). Call by value. 이것들은 파라미터 값을 넘길 때 value로 넘김.
객체형(배열, String, Integer, 사용자가 만드는 class나 instance 등등). Call by reference. 이것들은 파라미터 값을 넘길 때 주소값으로 넘김.
Ch06 > DataEx.java
package ch06;
//중요, 면접 단골 문제, 별 3개
class Data {
int kor;
int eng;
int math;
//call by reference
void addRef(Data d1, Data d2) {
//주소에 있는 값을 변환함. 참조 주소를 넘겨줌. 그래서 이 값이 변화가 되면 외부에서도 값이 변경돼있음.
//객체형이라 파라미터 값을 넘길 때 주소값으로 넘기기 때문에 주소값이 변화하는 것임.
d1.kor = d2.eng;
System.out.println("call by reference addRef Method 국어 점수 : " + d1.kor);
}
//call by value
void addvalue(int kor, int eng) { //주소 값이 아니라 실제 값이 넘어감.
kor = eng;
System.out.println("call by value addValue Method 국어 점수 : " + kor);
}
}
public class DataEx {
public static void main(String[] args) {
Data d1 = new Data();
Data d2 = new Data();
Data d3 = new Data();
d1.kor = 50;
d1.math = 70;
d2.eng = 80;
d3.addRef(d1, d2); //instance를 넘겨주면 주소값을 넘겨주는 효과.
System.out.println("Main 국어 점수 : " + d1.kor);
d3.addvalue(80, 70); //Value값을 넘겨줌. 내부적으로 값을 볼 수 없기 때문에 0이 나옴.
System.out.println("Main 국어 점수 : " + d3.kor);
}
}
출력 결과
[8. 다형성, 추상 Interface]
p.3
1) 오버로딩(overloading) - 메소드 다중정의
2) 오버라이딩(overriding) - 메소드 재정의
Ch08 > Robot.java
package ch08;
//-------------------------------------------------------
//인터페이스는 1) 양식의 역할( 큼) 함 ,
// 2) 다중상속 지원(극히 일부분..)
// 3) class 와 class 를 연결 해줌 (중요)
//-------------------------------------------------------
public interface Robot {
//아무것도 없는 무 의 상태
}
//위가 아무것도 없는 무의 상태인데도
//implements로 Robot을 묶었더니
//서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게
//하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계가 매핑됨.
//즉 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
class DanceRobot implements Robot {
void dance() {
System.out.println("춤을 춥니다.");
}
}
class DrawRobot implements Robot {
void draw() {
System.out.println("그림을 그립니다.");
}
}
class SingRobot implements Robot {
void sing() {
System.out.println("노래를 부릅니다.");
}
}
RobotEx.java
package ch08;
public class RobotEx {
static void action(Robot r) {
if( r instanceof DanceRobot) { // r이 DanceRobot이면 실행.
((DanceRobot)r).dance();
} else if ( r instanceof DrawRobot) {
((DrawRobot)r).draw();
} else {
//((SingRobot)r).sing();
SingRobot sr = (SingRobot) r; //(SingRobot) r 이 자체를 통째로 sr에 넣는 것임.
sr.sing();
}
}
public static void main(String[] args) {
Robot[] rb = new Robot[3];
rb[0] = new DanceRobot();
rb[1] = new DrawRobot();
rb[2] = new SingRobot();
for(Robot r : rb) {
action(r);
}
}
}
출력 결과
Volume.java
package ch08;
public interface Volume {
void volumeUp();
void volumeDown();
}
class TV implements Volume {
@Override
public void volumeUp() {
System.out.println("TV Volume 올리기");
}
@Override
public void volumeDown() {
System.out.println("TV Volume 내리기");
}
public void play() {
System.out.println("TV 화면을 본다.");
}
}
class Audio implements Volume {
@Override
public void volumeUp() {
System.out.println("Audio Volume 올리기");
}
@Override
public void volumeDown() {
System.out.println("Audio Volume 내리기");
}
}
class Speaker implements Volume {
@Override
public void volumeUp() {
System.out.println("Speaker Volume 올리기");
}
@Override
public void volumeDown() {
System.out.println("Speaker Volume 내리기");
}
}
VolumeEx.java
package ch08;
public class VolumeEx {
public static void main(String[] args) {
Volume[] vol = new Volume[3];
vol[0] = new TV();
vol[1] = new Speaker();
vol[2] = new Audio();
for(Volume v : vol) {
v.volumeUp();
v.volumeDown();
if (v instanceof TV) {
((TV) v).play();
}
}
}
}
출력 결과
[파일을 삭제할 때]
체크하지 않고 삭제하는 경우 : 물리적으로 날라가는 것이 아닌 workspace에서만 삭제되는 것임.(eclipse에서만 안보이는 것임.)
다시 eclipse에서 보이도록 복구하는 방법
물리적으로 삭제하는 방법 : 체크박스를 선택함.
.metadata 폴더는 세팅정보이다.
완전히 삭제한 파일을 source 폴더 안에 다시 저장해도 eclipse에 뜨지 않으므로 위의 방법으로 import를 해서 불러와야 함.
[ch20]
생성 과정
1. ch20 > 패키지 이름 변경 > robot (패키지)
2. robot 패키지 > Robot.java (추상 클래스)
package robot;
import robot.actions.FireAction; //robot.actions의 패키지 안에 FlyAction이 있다.
import robot.actions.FlyAction;
import robot.actions.KnifeAction;
public abstract class Robot {
//부모 선언만 해 놓음.
public FlyAction flyAction;
public FireAction fireAction;
public KnifeAction knifeAction;
public Robot() {
}
public abstract void shape();
public void actionBasic() {
System.out.println("팔, 다리, 머리, 몸통 존재.");
}
//전부 선언만 해 놓음. 3개 다 동적으로 환경에 따라서 교체할 수 있는 Strategy pattern이기 때문이다.
//비행 기능
public void actionFly() {
//선언만 해 놓았던 걸 실행할 수 있도록 함.
flyAction.fly();
}
//미사일 기능
public void actionFire() {
//선언만 해 놓았던 걸 실행할 수 있도록 함.
fireAction.fire();
}
//칼 기능
public void actionKnife() {
knifeAction.knife();
}
//Setter
public void setFlyAction(FlyAction flyAction) {
this.flyAction = flyAction;
}
public void setFireAction(FireAction fireAction) {
this.fireAction = fireAction;
}
public void setKnifeAction(KnifeAction knifeAction) {
this.knifeAction = knifeAction;
}
}
3. ch20 > package 생성 > Robot.actions (패키지)
4. robot.actions 패키지 > FireActrion.java (인터페이스)
package robot.actions;
public interface FireAction {
// 미사일 발사
public void fire();
}
5. robot.actions 패키지 > FireNo.java (클래스, 4.인터페이스 상속)
package robot.actions;
public class FireNo implements FireAction {
@Override
public void fire() {
System.out.println("미사일 발사 기능 없음.");
}
}
6. robot.actions 패키지 > FireOk.java (클래스, 4.인터페이스 상속)
package robot.actions;
public class FireOk implements FireAction {
@Override
public void fire( ) {
System.out.println("미사일 발사");
}
}
7. robot.actions 패키지 > FlyAction.java (인터페이스)
package robot.actions;
public interface FlyAction {
public void fly();
}
8. robot.actions 패키지 > FlyNo.java (클래스) (7. 인터페이스 상속)
package robot.actions;
public class FlyNo implements FlyAction {
@Override
public void fly() {
System.out.println("날 수 없어요.");
}
}
9. robot.actions 패키지 > FlyOk.java (클래스) (7. 인터페이스 상속)
package robot.actions;
public class FlyOk implements FlyAction {
@Override
public void fly() {
System.out.println("날 수 있어요.");
}
}
10. robot.actions 패키지 > KnifeAction.java (인터페이스)
package robot.actions;
//과제
public interface KnifeAction {
public void knife();
}
11. robot 패키지 > CheapRobot.java (클래스, 2. 클래스 상속)
package robot;
import robot.actions.FireNo;
import robot.actions.FlyNo;
import robot.actions.KnifeNo;
public class CheapRobot extends Robot {
public CheapRobot() {
flyAction = new FlyNo();
fireAction = new FireNo();
knifeAction = new KnifeNo();
}
//추상메소드 반드시 구현해야 함.
@Override
public void shape() {
System.out.println("걷을 수 있습니다.");
}
}
12. robot 패키지 > StandardRobot.java (클래스, 2. 클래스 상속)
package robot;
import robot.actions.FireOk;
import robot.actions.FlyNo;
import robot.actions.KnifeAction;
import robot.actions.KnifeWithWood;
public class StandardRobot extends Robot {
public StandardRobot() {
flyAction = new FlyNo();
fireAction = new FireOk();
knifeAction = new KnifeWithWood();
}
@Override
public void shape() {
System.out.println("달릴 수 있습니다.");
}
}
13. robot 패키지 > SuperRobot.java (클래스, 2. 클래스 상속)
package robot;
import robot.actions.FireOk;
import robot.actions.FlyOk;
import robot.actions.KnifeWithLazer;
public class SuperRobot extends Robot {
public SuperRobot() {
flyAction = new FlyOk();
fireAction = new FireOk();
knifeAction = new KnifeWithLazer();
}
@Override
public void shape() {
System.out.println("날 수 있습니다.");
}
}
14. robot 패키지 > MainClass.java (메인 클래스)
package robot;
public class MainClass {
public static void main(String[] args) {
System.out.println("-- SuperRobot 주문 --");
Robot superRobot = new SuperRobot(); //superRobot에 자식 대입. 이를 실행하는 순간에 robot에서 선언만 해 놓은 것들의 메모리를 만들어줌.
superRobot.actionBasic();
superRobot.shape();
superRobot.actionFly();
superRobot.actionFire();
superRobot.actionKnife();
System.out.println("------------------------");
System.out.println("-- StandardRobot 주문 --");
Robot standardRobot = new StandardRobot();
standardRobot.actionBasic();
standardRobot.shape();
standardRobot.actionFly();
standardRobot.actionFire();
standardRobot.actionKnife();
System.out.println("------------------------");
System.out.println("-- CheapRobot 주문 --");
Robot cheapRobot = new CheapRobot();
cheapRobot.actionBasic();
cheapRobot.shape();
cheapRobot.actionFly();
cheapRobot.actionFire();
cheapRobot.actionKnife();
}
}
15. robot.actions 패키지 > KnifeNo (클래스) (10. 인터페이스 상속)
package robot.actions;
public class KnifeNo implements KnifeAction {
@Override
public void knife() {
System.out.println("칼 No");
}
}
16. robot.actions 패키지 > KnifeWithLazer (클래스) (10. 인터페이스 상속)
package robot.actions;
public class KnifeWithLazer implements KnifeAction {
@Override
public void knife() {
System.out.println("Lazer 검 있음.");
}
}
17. robot.actions 패키지 > KnifeWithWood (클래스) (10. 인터페이스 상속)
package robot.actions;
public class KnifeWithWood implements KnifeAction {
@Override
public void knife() {
System.out.println("목검 있음.");
}
}
출력 결과
[Strategy(전략)]
- 동일한 계열의 알고리즘들을 개별적으로 캡슐화하여 상호 교환할 수 있게 정의하는 패턴. 클라이언트는 독립적으로 원하는 알고리즘을 선택하여 사용할 수 있으며, 클라이언트에 영향 없이 알고리즘의 변경이 가능함.
- 예를 들어 위의 로봇 회사에서 이벤트성으로 CheapRobot이지만 FlyOk 로 바꾸는 등 전략을 바꾸거나 시스템에서 환경을 바꿀 때 안정성에 문제 없이 쉽게 바꿀 수 있음. 이것을 만약 Main 클래스로 구현하게 되면 굉장히 복잡해지고 시스템의 안정성을 보장할 수 없음. 이렇게 잠깐 교체시킬 수 있는 FireOK, FireNo, FlyOk, FlyNo 같은 걸 부품이라고 함. 클래스의 부품화.
- 즉 상황에 따라 전략 A, 전략 B 등으로 안정성을 유지하며 전략(Strategy)을 바꿀 수 있게 해주는 디자인패턴 중 하나.
[ch08 > new > package > exam]
RemoteControl.java (인터페이스)
package exam;
public interface RemoteControl {
//상수
int MAX_VOLUME = 10;
int MIN_VOLUME = 0;
//추상 메소드
void turnOn(); //추상메소드는 turnOn() {} 이렇게 하면 안됨.
void turnOff();
void setVolume(int volume);
//디폴트 메소드
default void setMute(boolean mute) { //추상메소드는 default를 쓰지 않으면 자세히 구현할 수 없음.
if(mute) {
System.out.println("무음 처리합니다.");
} else {
System.out.println("무음 해제합니다.");
}
}
//정적 메소드
static void changeBattery() {
System.out.println("건전지를 교환합니다.");
}
}
Audio.java (클래스, 인터페이스 RemoteControl 상속)
package exam;
public class Audio implements RemoteControl {
//필드(멤버변수)
private int volume;
@Override
public void turnOn() {
System.out.println("Audio를 켭니다.");
}
@Override
public void turnOff() {
System.out.println("Audio를 끕니다.");
}
@Override
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME; //10이 최대다
} else if(volume<RemoteControl.MIN_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME; //-는 없다.
} else {
this.volume = volume;
}
System.out.println("현재 Audio 볼륨 :" + this.volume);
}
}
Television.java (클래스, 인터페이스 RemoteControl 상속)
package exam;
public class Television implements RemoteControl {
//필드
private int volume;
@Override
public void turnOn() {
System.out.println("TV를 켭니다.");
}
@Override
public void turnOff() {
System.out.println("TV를 끕니다.");
}
@Override
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME;
} else if(volume<RemoteControl.MIN_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME;
} else {
this.volume = volume;
}
System.out.println("현재 TV 볼륨 : " + this.volume);
}
}
RemoteControlEx.java (클래스)
package exam;
public class RemoteControlEx {
public static void main(String[] args) {
//Strategy 패턴 쓸 때 선언과 메모리 할당을 따로 해주어 쓸 때만 메모리 할당을 해 준다.
//1. 선언(선언만 해놓고)
RemoteControl rc = null;
RemoteControl rc2 = null;
//2. 메모리 할당(그 뒤에 원하는 것 메모리 할당)
rc = new Television();
rc.turnOn();
rc.turnOff();
rc.setVolume(13);
rc.setMute(true);
RemoteControl.changeBattery();
//3.
rc2 = new Audio();
rc2.turnOn();
rc2.turnOff();
rc2.setVolume(13);
rc2.setMute(true);
RemoteControl.changeBattery();
}
}
[디버그하는 방법]
실행 과저이 궁금한 부분 문장에 > 오른쪽마우스 > 토글 브레이크포인트 > 디버그