튜터링 5회 차가 되는 날이다. 상속의 개념 , 상속과 생성자 , 업 캐스팅을 배웠다.
▷ 상속의 개념
▷ 상속의 장점
▷ 생성자
▷ 업 캐스팅
▷ 다운 캐스팅
▷ 과제
- 지난번 과제 보완
package 과제;
import java.util.Scanner;
class Person{ //참여할 사람 이름저장할 클래스
private String name; // 이름 저장할 필드
public Person(String name) { //생성자
this.name = name;
}
// public void insert_name(String name) { //입력받은 이름을 저장하는 함수
// this.name = name;
// }
public String Return_Name() { //저장된 이름 반환하는 함수
return this.name;
}
}
public class WordGameApp {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
System.out.println("끝말잇기 게임을 시작합니다...");
System.out.print("게임에 참가하는 인원은 몇 명입니까>>");
int num_P = sc.nextInt(); //참여자 수 입력
Person []Per_Arr = new Person[num_P]; //참여자 이름을 저장할 객체배열 생성
for(int i=0;i<num_P;i++) { //입력받은 이름을 Person클래스에 객체별로 저장
System.out.print("참여자의 이름을 입력하세요>>");
String name= sc.next(); //nextLine을 반복문에서 쓰는경우 Enter를 누르고 다시 nextLine실행 할 경우 Enter가 남아있어서 넘어가게 된다.
//Per_Arr[i].insert_name(name);
Per_Arr[i] = new Person(name); //객체배열 초기화
}
//게임시작!!
System.out.println("시작하는 단어는 아버지입니다");
int next=0; //누구 차례인지 알려주는 변수
String word = "아버지"; //게임 시작단어
while(true) { //게임참여자가 질때까지 실행
int lastIndex = word.length() -1; //마지막 문자 인덱스
char lastChar = word.charAt(lastIndex); //마지막 문자
System.out.print(Per_Arr[next].Return_Name() + ">>" ); //게임참여자 차례를 알려준다
word = sc.next(); //단어 입력받기
char firstChar = word.charAt(0); //입력받은 단어 첫글자
if(firstChar!=lastChar) { //입력한 첫번째 글자와 전차례 참여자가 입력한 마지막 글자와 다른 경우
System.out.println(Per_Arr[next].Return_Name()+"이 졌습니다.");
break; //게임종료
}
next++; //다음 사람으로 건너감
//if(next == num_P) //마지막 참여자 차례가 끝난후 처음 참여자 차례로 돌아감
// next=0;
next = next %num_P;
}
sc.close();
}
}
객체 배열에서 객체를 생성을 하고 따로 배열에 입력을 했었지만 생성과 동시에 배열에 입력하는 방식으로 수정했다.
그리고 다음 사람 차례로 넘어가는 방법을 if문을 사용하기보다는 나머지 연산을 통해 계산하는 방법이 효과적이라는 것을 알게 되었다.
- 상속의 개념
상속은 부모 클래스에서 생성되어 있는 필드, 메서드를 자식 클래스에서 사용할 수 있는 개념이다.
ex) 예전에는 휴대폰이 전화 가능만 있었지만 지금 스마트폰은 전화 기능과 동시에 인터넷, TV 등등의 기능이 있다. 그러므로 현재 스마트폰은 예전 휴대폰으로부터 전화 기능을 상속받았다 라고 표현한다.
class A {
//필드,메소드
}
class B extends A{
//필드 , 메소드
}
또한 공부 4일 차에서 공부한 접근 지정자 https://hj39-develop.tistory.com/16#Five를 참고하면 된다.ㅎ
자식 클래스에서 부모 클래스의 필드, 메서드에 접근할 수 있지만 부모 클래스의 private은 접근이 불가능하다.
- 상속의 장점
상속을 받지 않았다고 하면 모든 클래스들에서 따로따로 필드, 메서드를 구현해야 한다. 그리고 여러 클래스중 하나의 메서드가 오류가 발생한 경우 모든 클래스들을 수정해야 한다. 예를 들면 A 클래스와 B 클래스가 있고 A와 B에 같은 메서드 C가 있다고 가정하자 만약 C에서 문제가 발생한 경우 A와 B 두 개의 클래스를 수정해주어야 한다. '뭐야 2개밖에 안되는데?'라는 생각을 할 수 있지만 2개가 아니라 만약 1000개가 되는 경우 문제가 심각해진다. 무려 1000개의 클래스들을 수정해주어야 하기 때문이다. 이러한 문제를 해결하기 위해서 A클래스를 B클래스에 상속해주면 메서드 C에서 문제가 발생할 경우 A클래스의 메서드 C를 한 번만 수정해주면 문제가 해결된다.
- 생성자
→super
자식 클래스에서 부모 클래스의 필드를 참 초할 때 사용한다.
package Ch05;
class A {
int a =3;
int b =4;
}
class B extends A{
int c;
int d;
public void print(){
System.out.println(super.a);
}
}
public class test {
public static void main(String[] args) {
B p = new B();
p.print();
}
}
→super()
자식 클래스에서 부모 클래스의 생성자를 호출할 때 사용한다.
반드시 자식 클래스 생성자의 맨 첫 번째 줄에 사용!!
package Ch05;
class A {
int a ;
int b ;
public A() {}
public A(int a, int b) {
this.a = a; this.b=b;
}
}
class B extends A{
int c;
int d;
public B(int a,int b,int c, int d) {
super(a,b); //첫번째 줄에 사용!!
this.c = c; this.d=d;
}
public void print(){
System.out.println(super.a +" , "+ super.b+" , "+c+" , "+d);
}
}
public class test {
public static void main(String[] args) {
B p = new B(1,2,3,4);
p.print();
}
}
- 업 캐스팅
자식 클래스 객체의 타입을 부모 클래스 객체 타입으로 변환한다.
부모 클래스 객체 타입으로 변한 자식 클래스 객체는 부모 클래스의 필드, 메서드에 접근 가능하다.
package Ch05;
class A {
int a ;
int b ;
public A() {}
public void printA(){
System.out.println(a +" , "+b);
}
}
class B extends A{
int c;
int d;
public B() {}
public void printB(){
System.out.println(super.a +" , "+ super.b+" , "+c+" , "+d);
}
}
public class test {
public static void main(String[] args) {
A q = new B(); //업캐스팅
q.printA();
q.printB(); //에러발생!
}
}
업 캐스팅된 경우 위와 같이 자식 클래스의 필드, 메서드에 접근하는 경우 에러가 발생한다.
- 다운 캐스팅
다운 캐스팅은 부모 클래스 객체 타입을 자식 클래스 객체 타입으로 변환하는 것이다.
업 캐스팅은 자동적으로 타입이 변환이 되지만 다운 캐스팅은 직접 타입을 변환해야 한다.
다운 캐스팅은 업 캐스팅이 먼저 실행이 된 후 사용되어야 한다.
package Ch05;
class A {
int a = 1;
int b = 2;
public void printA() {
System.out.println(a + " , " + b);
}
}
class B extends A {
int c = 3;
int d = 4;
public void printB() {
System.out.println(super.a + " , " + super.b + " , " + c + " , " + d);
}
}
public class test {
public static void main(String[] args) {
A t = new B(); //업캐스팅
B q = (B) t; // 다운캐스팅
q.printA();
q.printB();
}
}
다운 캐스팅은 업 캐스팅 후 되돌리는 데 사용한다고 한다.
- 과제
백준 알고리즘 2445번 문제
별 그리는 문제이다.
import java.util.Scanner;
public class Draw_Star {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int row_num = 2*N-1; // 행의 총개수
int count=N-1; //별이 하나씩 추가되기 위한 변수
int B_count =2*(N-1); //띄어쓰기 개수
for(int i=0;i<N;i++) { //가운데 기준 위쪽 부분
for(int j=N;j>count;j--) { //좌측 별 그리기
System.out.print("*");
}
for(int k=0;k<B_count;k++) { //띄어쓰기 출력
System.out.print(" ");
}B_count=B_count-2; //띄어쓰기 개수 두개씩 감소
for(int j=N;j>count;j--) { //우측 별 그리기
System.out.print("*");
}
count--;
System.out.println();
}
int num = N-1;
B_count=2;
for(int i=0;i<row_num-N;i++) { //가운데 행 기준 아래 부분
for(int j=num;j>0;j--) { //좌측별 그리기
System.out.print("*");
}
for(int j=0;j<B_count;j++) // 입력숫자가 5인경우 2 4 6 8 식으로 +2씩 증가
System.out.print(" ");
B_count=B_count+2;
for(int j=num;j>0;j--) { //우측 별 그리기
System.out.print("*");
}
num--;
System.out.println();
}
sc.close();
}
}
생각보다 조금 까다로웠다.
5일 차를 마치니 자바라는 문법에 익숙해진 것 같다.
'JAVA' 카테고리의 다른 글
[JAVA] 공부 7일차! (2021-07-28) (0) | 2021.07.29 |
---|---|
[JAVA] 공부 6일차! (2021-07-26) (0) | 2021.07.28 |
[JAVA] 공부 4일차! (2021-07-21) (0) | 2021.07.22 |
[JAVA] 공부 3일! (2021-07-16) (0) | 2021.07.17 |
[JAVA] 공부 2일!! (2021-07-14) (0) | 2021.07.15 |