JAVA - 5

Date:

카테고리:

태그:

img


TIC-TAC-TOE.java

TIC-TAC-TOE.java를 만들었으나 몇가지 문제가 있습니다.

  1. ArrayIndexOutOfBoundsException: 사용자로부터 입력 받은 좌표 xy를 바탕으로 board[x][y]를 접근하는 부분에서 배열 인덱스 범위를 초과할 수 있습니다. 이는 사용자가 0, 1 또는 2 이외의 값을 입력할 때 발생할 수 있습니다.
  2. 게임 종료 조건이 없음: 현재 코드에서는 무한 반복문(do-while)을 사용하고 있으며, 게임 종료 조건이 없어서 게임이 끝나지 않습니다.
  3. 컴퓨터가 수를 놓는 로직이 누락됨: 컴퓨터가 자동으로 수를 놓는 부분이 없어서 게임이 사용자의 입력만으로 진행됩니다.

  4. ArrayIndexOutOfBoundsException: 사용자로부터 입력 받은 좌표 xy를 바탕으로 board[x][y]를 접근하는 부분에서 배열 인덱스 범위를 초과할 수 있습니다. 이는 사용자가 0, 1 또는 2 이외의 값을 입력할 때 발생할 수 있습니다.
  5. 게임 종료 조건이 없음: 현재 코드에서는 무한 반복문(do-while)을 사용하고 있으며, 게임 종료 조건이 없어서 게임이 끝나지 않습니다.
  6. 컴퓨터가 수를 놓는 로직이 누락됨: 컴퓨터가 자동으로 수를 놓는 부분이 없어서 게임이 사용자의 입력만으로 진행됩니다.

수정된 TIC-TAC-TOE.java

출력화면 :

Image description


City.java

readInput() 메서드는 사용자로부터 도시 이름, 현재 인구 수, 인구 증가율을 입력받습니다.

writeOutput() 메서드는 도시의 이름, 현재 인구 수, 인구 증가율을 출력합니다.

computeFuturePopulation() 메서드는 주어진 년수에 따라 예상 인구를 계산합니다. 주어진 인구 증가율에 따라 인구를 계산하고, 주어진 년수만큼 반복하여 예상 인구를 계산합니다. 계산된 예상 인구를 반환합니다.


CityDriver.java

main() 메서드는 사용자로부터 계속하기 여부와 도시 정보를 입력받아 처리합니다.

  • aCity 변수는 City 객체를 참조하기 위한 변수입니다.
  • newPopulation 변수는 예상 인구를 저장하기 위한 변수입니다.
  • again 변수는 계속하기 여부를 저장하기 위한 변수입니다.

사용자가 계속하기를 원하는 동안 다음 작업이 반복됩니다:

  • aCity 객체를 생성합니다.
  • 사용자로부터 예상 인구를 계산할 기간(년)을 입력받습니다.
  • aCity의 도시 이름, 인구, 인구 증가율을 입력받습니다.
  • aCity의 도시 이름, 인구, 인구 증가율을 출력합니다.
  • aCity의 예상 인구를 계산합니다.
  • 예상 인구를 출력합니다.
  • 사용자에게 계속하기 여부를 입력받습니다.

프로그램이 종료되면 “프로그램을 종료합니다.”라는 메시지가 출력됩니다.


Button1.java

Button1 클래스는 JFrame을 상속하고 있으며, 프레임에 버튼을 추가하고 설정하는 기능을 제공합니다.

  • Button1() 생성자는 프레임의 초기 설정을 수행합니다.
  • setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)은 프레임을 닫을 때 프로그램을 종료하도록 설정합니다.
  • setTitle("대박")은 프레임의 제목을 설정합니다.
  • setLayout(new FlowLayout())는 프레임의 레이아웃을 플로우 레이아웃으로 설정합니다.
  • Button 객체를 생성하고 버튼의 텍스트를 설정합니다.
  • add(btn1)을 통해 버튼을 프레임에 추가합니다.
  • setBackground(Color.CYAN)은 버튼의 배경색을 시안(Cyan)으로 설정합니다.
  • setForeground(Color.RED)은 버튼의 전경색(글자색)을 빨강(Red)으로 설정합니다.
  • setEnabled(false)은 해당 버튼을 사용하지 않도록 설정합니다.
  • setBackground(Color.PINK)은 프레임의 배경색을 핑크(Pink)로 설정합니다.
  • setForeground(Color.BLUE)은 프레임의 전경색(글자색)을 파랑(Blue)으로 설정합니다.
  • setSize(200, 200)은 프레임의 크기를 설정합니다.
  • setVisible(true)은 프레임을 화면에 보이도록 설정합니다.

main() 메서드에서 Button1 클래스를 생성하고 실행하면 프레임이 생성되고 버튼이 표시됩니다.

출력화면 :

Image description


MethodOverriding.java - 오버라이딩

MethodOverridingEx 클래스는 paint() 메서드를 정의하고 있습니다. 이 메서드는 Shape 타입의 매개변수를 받고, 해당 객체의 draw() 메서드를 호출합니다. 이때, draw() 메서드는 오버라이딩(재정의)되었을 때 동적 바인딩(dynamic binding)을 통해 실제 참조되는 객체의 메서드가 호출됩니다.

Shape 클래스는 슈퍼 클래스로, next라는 멤버 변수와 draw() 메서드를 가지고 있습니다.

Line, Rect, Circle 클래스는 Shape 클래스를 상속받은 자식 클래스들로, 각각 draw() 메서드를 오버라이딩하여 재정의하고 있습니다.

main() 메서드에서는 다양한 객체를 생성하고 paint() 메서드에 넘겨줌으로써 다양한 오버라이딩된 draw() 메서드가 호출되는 것을 확인할 수 있습니다.


MethodOverloading.java - 오버로딩

MethodOverloading 클래스는 OverLoading이라는 클래스를 정의하고 있습니다. 이 클래스에는 titleauthor라는 인스턴스 변수가 있습니다.

OverLoading 클래스에는 두 개의 생성자가 정의되어 있습니다. 첫 번째 생성자는 String t라는 하나의 매개변수를 받습니다. 이 생성자는 작자를 알 수 없을 때 사용됩니다. 따라서 author 변수는 “작자미상”으로 초기화됩니다.

두 번째 생성자는 String tString a라는 두 개의 매개변수를 받습니다. 이 생성자는 작자를 알 때 사용됩니다. title 변수는 t로, author 변수는 a로 초기화됩니다.

main() 메서드에서는 OverLoading 클래스의 객체인 littlePrinceloveStory를 생성합니다. littlePrince 객체는 첫 번째 생성자를 사용하여 “어린왕자”와 “생택쥐페리”를 전달하고, loveStory 객체는 두 번째 생성자를 사용하여 “춘향전”만 전달합니다.

각 객체의 titleauthor 값을 출력하면, 초기화된 값이 정상적으로 출력됩니다.

이 예제는 매개변수의 수에 따라 다른 생성자를 사용하여 객체를 초기화하는 메서드 오버로딩의 개념을 보여주고 있습니다. 메서드 오버로딩은 같은 이름의 메서드를 여러 개 정의하고, 매개변수의 수나 타입을 다르게 하여 다양한 상황에 맞게 메서드를 호출할 수 있도록 합니다.


Upcasting.java - 업캐스팅

Animal 클래스는 makeSound() 메서드를 가지고 있습니다. 이 클래스는 부모 클래스로 사용될 것입니다.

Dog 클래스는 Animal 클래스를 상속받은 자식 클래스입니다. makeSound() 메서드를 오버라이딩하여 재정의하고, wagTail() 메서드를 추가로 가지고 있습니다.

Upcasting 클래스의 main() 메서드에서는 Animal 객체인 myAnimal을 선언하고, 이 객체에 new Dog()Dog 클래스의 객체를 할당합니다. 이때, 업캐스팅이 자동으로 이루어집니다. 즉, Dog 객체는 Animal 객체로 취급됩니다.

myAnimal.makeSound()를 호출하면, 실제로 Dog 클래스의 오버라이딩된 makeSound() 메서드가 호출됩니다. 결과적으로 “Dog is barking”이 출력됩니다.

하지만 myAnimalAnimal 타입으로 선언되었기 때문에 wagTail() 메서드에는 접근할 수 없습니다. 이는 업캐스팅된 객체는 부모 클래스의 멤버들에만 접근할 수 있다는 제약을 나타냅니다.

업캐스팅은 다형성을 활용할 때 주로 사용되는 개념입니다. 부모 클래스 타입으로 선언된 변수에 여러 자식 클래스의 객체를 할당하여, 공통된 부모 클래스의 멤버들을 일관되게 사용할 수 있습니다. 이를 통해 코드의 유연성과 확장성을 높일 수 있습니다.


DownCasting.java - 다운캐스팅

Parent 클래스와 Child 클래스가 정의되어 있습니다. Parent 클래스에는 sayHello()sayGoodbye()라는 두 개의 메서드가 있고, Child 클래스는 Parent 클래스를 상속받아서 이들 메서드를 오버라이딩합니다.

Downcasting 클래스의 main() 메서드에서는 업캐스팅과 다운캐스팅을 보여줍니다.

먼저, Parent p = new Child();로 업캐스팅이 이루어집니다. 이는 자식 클래스(Child)의 객체를 부모 클래스(Parent)의 타입으로 참조하는 것입니다. 이후 p.sayHello()를 호출하면, 메서드 오버라이딩으로 인해 “Hello from Child”가 출력됩니다. 이는 동적 바인딩에 의해 실제 객체인 ChildsayHello()가 호출되기 때문입니다.

다음으로, pChild 타입으로 다운캐스팅하기 전에 instanceof 연산자를 사용하여 pChild 클래스의 인스턴스인지 확인합니다. 이를 통해 다운캐스팅이 안전하게 이루어질 수 있는지 확인합니다. pChild 클래스의 인스턴스라면, 다운캐스팅이 가능하고 그렇지 않다면 다운캐스팅을 수행하지 않습니다.

다운캐스팅을 수행하기 위해 (Child) p와 같이 타입 변환을 명시적으로 수행합니다. 그리고 c.sayGoodbye()를 호출하면, 메서드 오버라이딩으로 인해 “Goodbye from Child”가 출력됩니다.

다운캐스팅은 업캐스팅된 객체에만 적용할 수 있으며, 실제 참조되는 객체의 타입을 명시적으로 지정하여 자식 클래스의 필드와 메서드에 접근할 수 있습니다. 하지만 다운캐스팅은 항상 안전하게 이루어지지 않을 수 있으므로 instanceof를 사용하여 실제 참조하는 객체의 타입을 확인하는 것이 좋습니다.

java 카테고리 내 다른 글 보러가기

댓글 남기기