본문 바로가기
수업 일지/JAVA

11일차 - [JAVA] 클래스/객체/상속

by 쿠쿠씨 2022. 1. 13.
반응형

연습문제: 빨간펜 2자리 덧셈

 

문제

----------------------------------------------
빨간펜 수학 2자리 덧셈 문제 풀기
---------------------------------------------- 
시작합니다.
문제 1.  23 + 56 =  답 입력 -> 
문제 2.  33 + 19 =  답 입력 ->
         :
문제 10. 28 + 32 =  답 입력 ->

----------------------------------------------
채점 합니다. 맞은 갯수  ...  ( .. 점)

틀린 문제 다시보기, 계속 하시겠습니까?

15라인 두 자리 난수를 저장할 변수 n1, n2를 선언한다

18라인 사용자에게 입력 받을 변수 answer를 선언한다.

20라인 do-while문을 사용하여 사용자의 선택에 따라 반복 실행이 가능하도록 한다.

21,22라인 점수를 저장할 변수 score, 맞은 개수를 저장할 변수 cnt를 선언한다. (score 선언 안하고 cnt*10 으로 가능)

 → while문 반복할 때마다 0으로 초기화한다.

23,24라인 틀린 문제를 다시 보여주기 위해 난수를 저장할 배열 q1, q2를 선언하고 길이를 10으로 한다.

25라인 정답 여부를 저장할 배열 problem을 선언하고 길이를 10으로 한다.

28라인 for문을 이용하여 문제를 10번 반복한다.

29,30라인 10~99범위의 난수를 n1, n2에 저장한다.

31,32라인 문제를 출력하고 답을 입력받아 answer에 저장한다.

33~36라인 답을 맞춘다면 score를 10점 더하고 cnt를 1 더한다. problem 인덱스에는 true 값을 저장한다. 

37~38라인 답이 틀렸으면 problem 인덱스에 false를 저장한다.

40라인 한 문제가 끝날 때마다 q1, q2의 인덱스에 n1, n2를 저장한다.

43라인 맞은 개수와 점수를 출력한다.

45~48라인 for문을 이용하여 틀린 문제를 찾아 문제 번호와 문제, 답을 출력한다.

52라인 사용자가 0을 입력하면 while문을 반복하여 다시 문제를 낸다. 다른 입력을 받으면 반복을 종료한다.

 

결과

클래스와 객체 복습

 

클래스

필드와 메소드로 구성된다.

필드는 데이터를 저장하기 위한 목적으로 사용된다. (클래스의 전역변수)

메소드는 필드의 값을 이용한 동작이다.

필드와 메소드는 static 또는 인스턴스 형태이다.

 

객체

클래스 설계를 바탕으로 만들어지는 복사본(인스턴스)이다.

new 연산으로 생성된다.

클래스 이름과 동일한 생성자 메소드를 실행하면서 객체가 생성된다.

인스턴스 필드, 인스턴스 메소드는 객체가 생성될 때마다 새로운 메모리를 할당받아 저장된다.

자바는 객체지향 프로그래밍이다. OOP(Object Oriented Programming)

 

클래스의 상속

 

상위(부모) 클래스에서 하위(자식) 클래스로 상속이 가능하다.

부모 클래스의 지정은 extends 키워드로 한다.

Public class B extends A { } → A는 부모 클래스 , B는 자식 클래스

extends 뒤에는 하나의 부모 클래스만 와야한다.

부모 클래스의 필드와 메소드는 자식 클래스가 바로 접근할 수 있다.(super 키워드 생략)

부모 클래스의 메소드는 재정의(override)할 수 있다.(이름, 반환값 형식, 인자 형식이 같을 때)

자식 클래스는 상속 필드, 상속 메소드 외에 다른 필드와 메소드를 정의할 수 있다.

 

자식 클래스(ClassB)에서 기본 생성자를 사용하려면 부모 클래스(ClassA)에 기본 생성자가 있어야 한다.

8~10라인(오른쪽) 부모 클래스(ClassA)에 기본 생성자가 없다면 자식 클래스(ClassB)에서 기본 생성자를 사용할 수 없다.

 → 오류 발생

부모 클래스(ClassA)에 커스텀 생성자가 있다면 자식 클래스(ClassB)에서 같은 형식의 커스텀 생성자를 사용할 수 있다.

13라인 super(ab);를 작성하여 부모 클래스의 생성자를 호출한다.

6라인(우측) 자식 클래스(ClassB)에서 부모 클래스(ClassA)에 없는 형식의 생성자를 호출할 수 없다.

 → 오류 발생

10라인 자신의 클래스(ClassB)의 필드 값을 사용하여 생성자를 선언할 수 있다.

 

상속 예제1: 도형

 

부모 클래스: Shape 클래스

4,5라인 static final 필드 MAX_WIDTH(너비 최대값), MAX_HEIGHT(높이 최대값)을 설정한다. (상수)

6~8라인 private 접근 제한을 갖는 필드 shapeName, width, height를 선언한다.

9라인 default 접근 제한을 갖는 필드 etc를 선언하고 초기값을 "연습용"으로 한다.

10라인 protected 접근 제한을 갖는 필드 count를 선언하고 초기값을 12로 한다.

13라인 3개의 인자를 갖는 커스텀 생성자를 선언한다.

18~25라인 private 접근 제한을 갖는 필드(shapeName, width, height)의 getter 메소드를 선언한다.

29라인 넓이를 구해서 반환하는 getArea() 메소드를 선언한다.

 

자식 클래스: Triangle 클래스

5,6라인 부모 클래스(Shape)와 같은 형식의 생성자를 선언하고 부모 생성자를 호출한다.(super)

9~14라인 부모 클래스(Shape)의 필드 값을 가져와 출력하는 print() 메소드를 선언한다.

16라인 부모 클래스에서 정의한 넓이를 구하는 getArea() 메소드를 삼각형의 넓이 공식으로 재정의(오버라이드)한다.

 → 16 왼쪽의 초록색 세모는 오버라이드를 나타낸다.

19라인 넓이를 double형으로 구하는 getAreaDouble() 메소드를 선언한다. 

 

 

자식 클래스: Square 클래스

6~8라인 부모 클래스에 기본 생성자가 없으므로 super(c) 입력시 오류가 발생한다.

10~12라인 부모 생성자를 호출하고 color 필드를 초기화한다.

14~16라인 인자로 color만을 받는 생성자를 선언하고, 필드 값을 저장하면서 부모 생성자를 호출하는 것도 가능하다. 

19~20라인 너비를 출력하는 메소드 printWidth()를 선언한다.

22~23라인 기타 정보를 출력하는 메소드 printEtc()를 선언한다.

25라인 getArea() 메소드를 재정의한다.(오버라이드)

 

ShapeTest

7라인 Triagle() 생성자를 이용하여 객체를 생성한다.

9라인 Triangle 클래스에 있는 print() 메소드를 호출한다.

10라인 오버라이드한 메소드 getArea()를 출력한다.

11라인 Triangle 클래스에 있는 getAreaDouble() 메소드를 출력한다.

13~14라인 부모클래스의 필드를 출력한다. 

 

상속 예제2: 동물

 

부모 클래스: Animal 클래스

5~6라인 private 접근 제한을 갖는 필드 color, name을 선언한다.

8~9라인 기본 생성자 Animal을 선언한다.

12~16라인 필드의 getter 메소드를 선언한다.

19~23라인 필드의 setter 메소드를 선언한다.

26~27라인 sound() 메소드를 선언한다. 

 

자식 클래스: Puppy 클래스

5라인 private 접근 제한을 갖는 필드 type를 선언한다.

8~9라인 type의 getter 메소드를 선언한다.

12~13라인 type의 setter 메소드를 선언한다.

15~16라인 test() 메소드를 선언한다.

20~22라인 Animal 클래스의 sound()를 재정의(오버라이드)한다.

 → @는 어노테이션이라 하며, 명령 실행에 도움을 주는 주석이다.

 

자식 클래스: Cat 클래스

5~7라인 기본 생성자를 선언한다.

11~12라인 Animal 클래스의 sound() 메소드를 재정의(오버라이드)한다.

 

AnimalTest

6라인 Puppy() 생성자를 이용하여 객체를 생성한다. Animal() 생성자에 있는 출력문이 출력된다.

8라인 오버라이드한 메소드 sound()를 호출한다.

9라인 setter 메소드를 이용하여 type 필드에 "poodle"을 저장한다

10라인 getter 메소드를 이용하여 "poodle"을 출력한다.

12라인 Cat() 생성자를 이용하여 객체를 생성한다. Animal() 생성자에 있는 출력문이 출력된다.

14라인 오버라이드한 메소드 sound()를 호출한다.

16라인 자식 객체는 부모 타입으로 참조할 수 있다.

18라인 test() 메소드는 Puppy 클래스(자식)에서 선언했기 때문에 Animal(부모) 참조 타입으로 호출할 수 없다.

20라인 Animal 참조 타입의 dog를 (Puppy)로 강제 캐스팅한다.

23라인 부모 객체는 자식 타입으로 참조할 수 없다.

반응형

댓글