연습기록/JAVA

[JAVA]캐스팅 연습-도형 넓이 구하는 프로그램 생성

박박소현 2024. 10. 29. 15:12

++요번 연습은 아직 제대로 숙지되지 못한 개념이기도 하고 챗GPT를 사용해보고 싶어 챗GPT를 같이 이용하여 연습을 진행해 보았다.

 

 

[문제]

1) Shape 클래스 생성

필드

-shape(도형의 모양 저장)

메서드

-"도형의 넓이는 어떻게 구할까요?"라는 문구를 출력하는 메서드 printArea()

생성자

-shape 초기화

 

2) Shape클래스의 자식 클래스 Rectangle 클래스 생성

필드

-가로길이, 세로길이

 

메서드

-"사각형의 넓이는 가로와 세로를 곱합니다!" 라는 문구를 출력하는 메서드 printArea() [오버라이드]

-사각형의 넓이를 반환하는 메서드(가로 x 세로) getArea()

생성자

-shape와 가로, 세로 길이 초기화

 

3) Shape클래스의 자식 클래스 Triangle 클래스 생성

필드

-너비, 높이

 

메서드

-"삼각형의 넓이는 가로와 세로를 곱합니다!" 라는 문구를 출력하는 메서드 printArea() [오버라이드]

-삼각형의 넓이를 반환하는 메서드(가로 x 세로 / 2) getArea()

생성자

-shape와 너비, 높이 길이 초기화

 

4) Main 클래스 생성

(1) Shape, Rectangle, Triangle 클래스의 객체 생성(Shape 타입으로 Upcasting 할것!)

(2) Shape 타입을 가지는 배열 생성후 (1)에서 만들어준 객체들을 배열의 요소에 추가

(3) 매개변수를 Shape타입의 객체를 받아오고 객체의 타입별로 printArea(), getArea() 메소드를 호출하는 메서드 print()정의

(4) 반복문을 활용해서 Shape 타입 배열요소 객체들을 print() 메소드의 인수로 전달

 

[풀이]

1.shape 클래스 생성

public class Shape {

	String shape;
	
	public void printArea() {
		System.out.println("도형의 넓이 어떻게 구할까요?");
	}
	
	public double getArea() {
		return -1;
	}

	public Shape(String shape) {
		this.shape = shape;
	}

-나중에 업캐스팅을 하기 위해서 getArea를 추가로 만들어 주었다

-getArea에 리턴값을 -1을 넣어준 이유는 밑에서 추가 설명 하겠다

 

2.Rectangle 클래스 생성

public class Rectangle extends Shape{
	int width;
	int lenght;
	
	public Rectangle(String shape, int width, int lenght) {
		super(shape);
		this.width = width;
		this.lenght = lenght;
	}

	@Override
	public void printArea() {
		System.out.println("사각형의 넓이는 가로와 세로를 곱합니다!");
	}
	
	@Override
	public double getArea() {
		return width*lenght;
	}

-shape의 자식 클래스가 되어야하니 extends를 사용해 shape을 상속 받아왔다

-생성자와 오버로딩은 자동생성 단축키를 이용하게 빠르게 만들어 주었다

-shape에 들어가 있는 필드(shape)을 Rectangle에서도 사용하기 위해 super를 이용해 같이 초기화 시켜주었다.

-오버로딩을 이용해 printArea()의 실행내용을 바꿔주었다.

 

3.Triangle 클래스 생성

public class Triangle extends Shape {
	int width;
	int higth;
	public Triangle(String shape, int width, int higth) {
		super(shape);
		this.width = width;
		this.higth = higth;
	}
	@Override
	public void printArea() {
		System.out.println("삼각형의 넓이는 너비와 높이를 곱한 후 2로 나눕니다!");
	}
	
	@Override
	public double getArea() {
		return width*higth/2.0;
	}
	
}

 

 

 

4.Shape 타입을 매개변수로 가져오는 print()메서드 생성

public static void print(Shape shape) {
			shape.printArea();
			
			double area =shape.getArea();
			
			
			if(area==-1) {
			System.out.println("없는 도형!");
			}else {
				
				System.out.println(shape.shape+"의 넓이:"+area); 
			}

-이 부분에서 shape을 출력했을때 다른 도형들과 달리 없는 도형이라는 내용을 출력해주기 위해 아까 getArea에 도형의 값으로 들어올 일이 없는 -1을 넣어주었다(이부분이 해결되지 않아 챗GPT의 도움을 받았다)

-조건문을 이용해 도형과 없는 도형의 실행 내용을 분리하여 출력될 수 있도록 해주었다

-Rectangle과 Triangle의 부모의 shape으로 세개의 클래스를 불러올 수 있는 코드를 한줄로 정리하였다.

 

 

 

4.Main에서 출력

 

public static void main(String[] args) {
		
		
		Shape s1 = new Shape("도형");
		Shape t1 = new Triangle("삼각형", 15, 56);
		Shape r1= new Rectangle("사각형", 20, 30);
		Shape[] shapes= 
				{s1,t1,r1};
		
		
		for(Shape shape: shapes) {
			
			print(shape);
		}

-도형의 길이들은 임의로 설정해서 모든 클래스들을 Shape타입으로 정의해주었다

-그렇게 만든 Shape타입의 변수들을 Shape타입의 배열 생성 후 넣어주었다

-향상for문을 이용하여 shape의 배열을 처음부터 끝까지 반복하도록 반복문을 지정해주었다.

 

[느낀점]

-클래스부분으로 넘어오고나서 확실히 여러번 해보지 않으면 제대로 이해하기 어려워졌다. 더 많은 연습이 필요할 거 같다

-AI를 처음 써보았는데 정확도에 큰 기대롤 하지 않은채로 사용해봤음에도 불구하고 정확한 정보와 내가 궁금한 부분을 제대로 집어서 설명해주는 것을 보고 놀라웠다. 적절히 잘 이용한다면 모르는 부분에 대해 알아갈 수 있는 좋은 방법이 될 수 있겠으나 이제 막 시작했기에 당분간은 챗gpt사용을 지양하기로 했다