
실제로 존재하는것을 SW상의 객체로 만드는것을 '객체 모델링' 추상화 라고함

객체들은 서로 메서드와 파라미터값을 통해 유기적으로 상호작용함.
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
public Car(String model) {
this(model, "Blue", 50000000);
}
public Car(String model, String color) {
this(model, color, 100000000);
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
new() 키워드를 활용하여 참조형 변수로 생성 가능.Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
public class Main {
public static void main(String[] args) {
Car[] carArray = new Car[3];
Car car1 = new Car();
car1.changeGear('P');
carArray[0] = car1;
Car car2 = new Car();
car2.changeGear('N');
carArray[1] = car2;
Car car3 = new Car();
car3.changeGear('D');
carArray[2] = car3;
for (Car car : carArray) {
System.out.println("car.gear = " + car.gear);
}
}
}
// 출력
//car.gear = P
//car.gear = N
//car.gear = D
double gasPedal(double kmh, char type) {
speed = kmh;
return speed;
}
void carSpeeds(double ... speeds) {
for (double v : speeds) {
System.out.println("v = " + v);
}
}
주소를 전달하기에 변경시 원본값이 변경됌.멤버 : 필드 + 메서드
인스턴스 멤버
클래스 멤버
static 키워드를 사용하여 선언.인스턴스 멤버는 클래스멤버 사용이가능하지만 반대는 불가. (객체가 없기 때문에)
지역변수
상수
Final 키워드를 통해 선언, 프로그램이 실행중엔 수정됄 수 없음.static final을 추가하여 사용한다.

폴더 개념 package oop.main;
import oop.pk1.Car;
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.horn(); // pk1 빵빵
oop.pk2.Car car2 = new oop.pk2.Car();
car2.horn(); // pk2 빵빵
}
}
extends 키워드를 사용한다.public class 자식클래스 extends 부모클래스 {
}


public void setCarInfo(String model, String color, double price) {
super.model = model; // model은 부모 필드에 set
super.color = color; // color는 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}


부모타입변수 = 자식타입객체 는 자동으로 부모타입으로 변환.자식타입변수 = (자식타입) 부모타입객체// 자식타입객체가 자동 타입변환된 부모타입의 변수
Mammal mammal = new Whale();
mammal.feeding();
// 자식객체 고래의 수영 기능을 사용하고 싶다면
// 다시 자식타입으로 강제 타입변환을 하면된다.
Whale whale = (Whale) mammal;
whale.swimming();
abstract 키워드로 선언public abstract class 추상클래스명 {
}
public abstract class 추상클래스명 {
abstract 리턴타입 메서드이름(매개변수, ...);
}
public interface 인터페이스명 {
public static final char A = 'A';
static char B = 'B';
final char C = 'C';
char D = 'D';
void turnOn(); // public abstract void turnOn();
}
모든 변수는 상수 이며, 모든 메서드는 추상클래스이다.
implements 키워드를 통해 수현이 가능하다.
추상메서드는 반드시 구현해야한다. 일부만 구현을 하고 싶을시 구현클래스를 추상클래스로 변경후 추상클래스를 구현하면됌.
인터페이스간의 상속을 지원. extends 키워드를 사용. /
다중상속이 가능하다.
public class Main implements C {
@Override
public void a() {
System.out.println("A");
}
@Override
public void b() {
System.out.println("B");
}
}
interface A {
void a();
}
interface B {
void b();
}
interface C extends A, B { }
default 키워드를 붙혀서 구현public class Main implements A {
@Override
public void a() {
System.out.println("A");
}
public static void main(String[] args) {
Main main = new Main();
main.a();
// 디폴트 메서드 재정의 없이 바로 사용가능합니다.
main.aa();
}
}
interface A {
void a();
default void aa() {
System.out.println("AA");
}
}
interface A {
void a();
default void aa() {
System.out.println("AA");
}
static void aaa() {
System.out.println("static method");
}
}

답안 :
package Cal;
public class Calculator {
//오퍼레이션을 받기 위한 private 필드 추가
private AbstractOperation operation;
// 생성자를 통해서도 오퍼레이션을 받을수 있다.
Calculator(AbstractOperation operation) {
this.operation = operation;
}
// 계산기의 오퍼레이션을 바꾸고 싶을시
public void setOperation(AbstractOperation operation) {
this.operation = operation;
}
//실질적 계산 호출부분
public double Calculate(int firstNumber, int secondNumber) {
double result = operation.operate(firstNumber, secondNumber);
return result;
}
}
package Cal;
public abstract class AbstractOperation {
// 상속시 계산부분구현을 명시
public abstract double operate(int a, int b);
}
package Cal;
// 추상클래스 상속
public class AddOperation extends AbstractOperation {
//추상클래스 추상메소드 구현 (오버라이딩 하여 메서드 구현내부변경)
@Override
public double operate(int a, int b) {
double result = a + b;
return result;
}
}
package Cal;
// 추상클래스 상속
public class SubstractOperation extends AbstractOperation {
//추상클래스 추상메소드 구현 (오버라이딩 하여 메서드 구현내부변경)
@Override
public double operate(int a, int b) {
double result = a - b;
return result;
}
}
package Cal;
// 추상클래스 상속
public class MultiplyOperation extends AbstractOperation {
//추상클래스 추상메소드 구현 (오버라이딩 하여 메서드 구현내부변경)
@Override
public double operate(int a, int b) {
double result = a * b;
return result;
}
}
package Cal;
// 추상클래스 상속
public class MultiplyOperation extends AbstractOperation {
//추상클래스 추상메소드 구현 (오버라이딩 하여 메서드 구현내부변경)
@Override
public double operate(int a, int b) {
double result = a / b;
return result;
}
}
package Cal;
public class Main {
public static void main(String[] args) {
// 계산기 객체 생성 및 생성자를 통해 더하기 오퍼레이션 전달
Calculator calc = new Calculator(new AddOperation());
double add = calc.Calculate(10, 20);
System.out.println("add : " + add);
// 동일 객체를 활용해 빼기연산
calc.setOperation(new SubstractOperation());
double sub = calc.Calculate(10, 20);
System.out.println("sub : " + sub);
// 동일 객체를 활용해 곱셈연산
calc.setOperation(new MultiplyOperation());
double mult = calc.Calculate(10, 20);
System.out.println("mult : " + mult);
// 동일 객체를 활용해 나눗셈연산
calc.setOperation(new DivideOperation());
double div = calc.Calculate(20, 10);
System.out.println("div : " + div);
}
}
