관리 메뉴

거니의 velog

230725 자바 강의 본문

대덕인재개발원_Java

230725 자바 강의

Unlimited00 2023. 7. 25. 19:47

[Shape.java]

package ddit.chap07.ex02;

//상속예제]
//1) 원(Circle) 클래스는 반지름(radius)과 도형이름(kind) 속성과 넓이를 구하여 실수형으로 반환하는 메서드(calculateArea())
//2) 삼각형은 밑변(width), 높이(height)의 속성, 도형이름(kind) 속성과 넓이를 구하여 실수형으로 반환하는 메서드(calculateArea())
//3) 사각형(Rectangle)은 가로(width), 세로(height)의 속성, 도형이름(kind) 속성과 넓이를 구하여 실수형으로 반환하는 메서드(calculateArea())
//   로 구성되어 있으며 이들 클래스의 공통 속성을 도형(Shape) 클래스로 구현

public class Shape {
	
	String kind;
	
	public Shape() {}
	
	public Shape(String kind) {
		this.kind = kind;
	}

	public double calculateArea() {
		return 0.0;
	}
	
}

[Rectangle.java]

package ddit.chap07.ex02;

public class Rectangle extends Shape {

	private int width;
	private int height;
	
	public Rectangle(String kind, int width, int height) {
		super(kind);
		this.width = width;
		this.height = height;
	}
	
	@Override
	public double calculateArea() {
		return (double) (width * height);
	}
	
}

[Triangle.java]

package ddit.chap07.ex02;

public class Triangle extends Shape {

	private int width;
	private int height;
	
	public Triangle(String kind, int width, int height) {
		super(kind);
		this.width = width;
		this.height = height;
	}
	
	@Override
	public double calculateArea() {
		return (double) width * height / 2;
	}
	
}

[Circle.java]

package ddit.chap07.ex02;

public class Circle extends Shape {
	
	private int radius;
	private final double PI = 3.1415926;
	
	public Circle(String kind, int radius) {
		super(kind);
		this.radius = radius;
	}
	
	@Override
	public double calculateArea() {
		return (double) (PI * (radius * radius));
	}

}

[ShapeExample.java]

package ddit.chap07.ex02;

public class ShapeExample {

	public static void main(String[] args) {
		
		Rectangle rec = new Rectangle("직사각형", 20, 30);
		System.out.println("도형 이름 : " + rec.kind);
		System.out.println("도형 넓이 : " + rec.calculateArea() + "\n");
		
		Triangle tri = new Triangle("이등변삼각형", 50, 30);
		System.out.println("도형 이름 : " + tri.kind);
		System.out.println("도형 넓이 : " + tri.calculateArea() + "\n");
		
		Circle cir = new Circle("원", 30);
		System.out.println("도형 이름 : " + cir.kind);
		System.out.println("도형 넓이 : " + cir.calculateArea() + "\n");
		
	}

}

콘솔 결과


자식 -> 부모클래스로 자동 형변환?

(Promotion) -> Upcasting (cast 연산자 생략됨.)

 

Shape s1 = new Circle(“”, 10);

s1의 타입은 부모 클래스. s1 변수는 호출 스택에 올라감.

new 연산자에 의해 Circle 객체가 힙 메모리에 올라감.

Circle 객체의 super()에 의해 Shape 객체가 힙 메모리에 anonymous로 만들어짐.

, 자식 클래스 객체가 만들어져서 부모 객체로 들어가는 것이 업캐스트.


[다형성]

자식 클래스가 생성되어서 부모 클래스 타입에 저장되면서, 메서드는 부모 클래스 메서드가 호출된다.

, 자식 클래스에서 재정의된 오버라이딩 메소드는 자식 메소드가 호출된다. 이것이 다형성.

부모 클래스로 자식 클래스 제어가 가능.

, 자식 클래스에서 고유하게 정의된 메서드는 부모 클래스의 변수로 호출 불가.

다형성으로 호출된 멤버 변수는 항상 부모 필드 참조. 자식 멤버 변수 호출 불가.


자식 클래스 멤버 변수를 참조하고 싶다면? 도로 자식 클래스로 형변환 해야 한다. 이것이 Downcasting (자식 cast 연산자 사용)

업캐스트 된 것만 다운캐스트 가능

부모 클래스 타입을 자식 클래스 타입으로 강제 형변환.

반드시 cast 연산자 사용 => (클래스명) => 생략 불가.

캐스트가 될 수 있는지 없는지에 따른 instanceof 연산자 사용.


컬렉션 프레임워크

자료구조의 데이터 타입이 여러 가지.

그 중 List 데이터 타입. 2차원 배열. Linear List.

1차원 배열에서 빈 공간이 발생하지 않는 배열.

데이터가 삭제되어 빈공간을 없애기 위해 구조가 움직이는 형태.

단점은 처리 속도가 느리다.

그래서 나온 것이 Linked List. 주소 태그를 다 가지고 있음.

Set 구조. 집합.

배열은 순서화가 인덱스로 되고 데이터 중복 허용.

집합은 {x|x=자연수}. 인덱스가 붙지 않는다. 데이터 자체가 키 값이 되므로 데이터 중복 불다. 순서화 되지 않고 중복을 허용하지 않는다. call 메소드로 iterator가 돌아야 한다.
해당 데이터가 저장된 기억 공간의 주소를 산출하는 것이 해시 코드. 이것이 같은지 비교. 데이터와 주소값이 같으면 데이터 저장 불가.

이 둘은 Collections라는 인터페이스 상속 받음.

Map <K, V> 쌍으로 저장.

관계형 데이터베이스. 이들을 저장하기에 가장 적합한 구조.

keypk, value는 데이터 저장.

인터페이스므로 객체 불가. 이들을 상속 받는 것이
List : LinkedList, ArrayList(많이 활용), Vector, Stack, Queue
-> add(), get() 메서드 사용할 경우 List 변수 = ArrayList 객체; 선언 시 List 객체에 정의한 추상 메서드만 사용 가능.
Set : HashSet, TreeSet => 거의 안 씀.
Map : HashMap(가장 많이 활용), TreeMap, properties, HashTable

이런 경우들이 업캐스트가 많이 활용되는 경우


객체 간 관계는 1촌 관계만 확인 가능.


[Vehicle.java]

package ddit.chap07.sec02;

public class Vehicle {

	public void run() {
		System.out.println("차량이 운행 중입니다.");
	}
	
}

class Bus extends Vehicle {
	
	@Override
	public void run() {
		System.out.println("버스가 운행 중입니다.");
	}
	
}

class Taxi extends Vehicle {
	
	@Override
	public void run() {
		System.out.println("택시가 운행 중입니다.");
	}
	
}

[Driver.java]

package ddit.chap07.sec02;

public class Driver {
	
	// 매개변수 업캐스팅 예제
	public void drive(Vehicle vehicle) {
		vehicle.run();
	}

}

[DriverExample.java]

package ddit.chap07.sec02;

public class DriverExample {

	public static void main(String[] args) {
		
		// 다형성 예제
		Driver driver = new Driver();
		
		driver.drive(new Bus()); // Vehicle vehicle = new Bus();
		// 버스가 운행 중입니다.
		
		Taxi taxi = new Taxi(); // Vehicle vehicle = taxi; taxi = new Taxi();
		driver.drive(taxi); 
		// 택시가 운행 중입니다.
		
	}

}

콘솔 결과


[Customer.java]

package ddit.chap06.sec05;

public class Customer {

	private int money;
	private int bonusPoint;
	private String cart = "";
	
	public Customer() {}
	
	public Customer(int money, int bonusPoint, String cart) {
		this.money = money;
		this.bonusPoint = bonusPoint;
		this.cart = cart;
	}

	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		this.money = money;
	}

	public int getBonusPoint() {
		return bonusPoint;
	}

	public void setBonusPoint(int bonusPoint) {
		this.bonusPoint = bonusPoint;
	}

	public String getCart() {
		return cart;
	}

	public void setCart(String cart) {
		this.cart = cart;
	}
	
	// 매개변수 업캐스팅으로 인한 다형성 예제
	public void buy(Goods goods) {
		money += goods.getPrice();
		bonusPoint += goods.getBonusPoint();
		cart += ", " + goods; // t.toString() 메서드 자동 실행
	}
	
	public void summary() {
		System.out.println("구입품목 : " + cart.substring(2));
		System.out.println("구입금액 합계 : " + money);
		System.out.println("적립 포인트 : " + bonusPoint);
	}
	
}

[HimartExample.java]

package ddit.chap06.sec05;

public class HimartExample {

	public static void main(String[] args) {
		
		Customer c1 = new Customer();
		
		c1.buy(new Audio());
		c1.buy(new Computer());
		c1.buy(new TV());
		
		c1.summary();
		
	}

}

콘솔 결과

 

'대덕인재개발원_Java' 카테고리의 다른 글

230727 자바 강의  (0) 2023.07.29
230726 자바 강의  (0) 2023.07.26
230724 자바 강의  (0) 2023.07.24
230721 자바 강의  (0) 2023.07.21
230720 자바 강의  (0) 2023.07.20