Skip to content
Home » 자바 객체 지향 연습 문제 | [자바 기초 26] 연습문제: 객체지향 16 개의 새로운 답변이 업데이트되었습니다.

자바 객체 지향 연습 문제 | [자바 기초 26] 연습문제: 객체지향 16 개의 새로운 답변이 업데이트되었습니다.

당신은 주제를 찾고 있습니까 “자바 객체 지향 연습 문제 – [자바 기초 26] 연습문제: 객체지향“? 다음 카테고리의 웹사이트 https://kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 홍팍 이(가) 작성한 기사에는 조회수 3,328회 및 좋아요 37개 개의 좋아요가 있습니다.

Table of Contents

자바 객체 지향 연습 문제 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [자바 기초 26] 연습문제: 객체지향 – 자바 객체 지향 연습 문제 주제에 대한 세부정보를 참조하세요

자바를 통한 객체지향 연습문제를 풀어봅시다.
도서구매: http://www.yes24.com/Product/Goods/104740689
강의자료: https://cloudstudying.kr/courses/61
실습문제: https://cloudstudying.kr/lectures/200#tab
강의문의: [email protected]
카톡ID: chaesam

자바 객체 지향 연습 문제 주제에 대한 자세한 내용은 여기를 참조하세요.

연습문제 D – 객체지향 프로그래밍 – 클라우드스터딩

이론 요약. 클라우드스터딩-자바-클래스와-객체-요약. 객체 지향 프로그래밍. OOP라고 한다. 프로그램을 객체의 …

+ 여기에 더 보기

Source: cloudstudying.kr

Date Published: 8/27/2021

View: 2702

[자바의정석] 객체지향 연습문제 6-1, 6-2 – velog

학원에서 JAVA 진도를 나가기 시작했다. 객체지향 이전 연산자,배열등은 어느정도 이해했으니 어려운 객체지향 문제들을 풀어보면서 계속 이해해보려 …

+ 여기에 보기

Source: velog.io

Date Published: 7/8/2021

View: 7242

[Java] 부록(1) 객체지향 프로그래밍 연습문제 – Devlog

[Java] 부록(1) 객체지향 프로그래밍 연습문제. 덩이 2022. 3. 14. 21:46. 위 글은 해당 카테고리의 수업 강의 자료(연습문제)를 정리한 것입니다.

+ 여기에 더 보기

Source: devlog2829.tistory.com

Date Published: 8/10/2021

View: 4493

[Java의 정석_연습문제 풀이] Chapter6 객체지향 프로그래밍1

[Java의 정석_연습문제 풀이] Chapter6 객체지향 프로그래밍1 … [6-2] 문제 6-1에서 정의한 SutdaCard클래스에 두 개의 생성자와 info()를 추가해서 …

+ 더 읽기

Source: developer-ek.tistory.com

Date Published: 3/10/2022

View: 2826

[자바 기초 26] 연습문제: 객체지향 8260 좋은 평가 이 답변

자바 객체 지향 연습 문제 주제에 대한 자세한 내용은 여기를 참조하세요. 연습문제 D – 객체지향 프로그래밍 – 클라우드스터딩. 이론 요약.

+ 여기를 클릭

Source: you.dianhac.com.vn

Date Published: 10/9/2022

View: 262

04장 연습문제 – 점프 투 자바

04장 연습문제. (연습문제 풀이 : https://wikocs.net/157712#04) … 이전글 : 04-05 for each 문; 다음글 : 05장 객체지향 프로그래밍.

+ 자세한 내용은 여기를 클릭하십시오

Source: wikidocs.net

Date Published: 4/10/2021

View: 8352

객체지향 프로그래밍 연습 문제 – 공대생의 it – 티스토리

공대생 it 님의 블로그입니다. 구독하기. 프로필 사진. 코드를 통해 본 빵형의 실전자바의 다른 글.

+ 여기에 보기

Source: tnrn211.tistory.com

Date Published: 10/8/2022

View: 5961

객체 지향 프로그래밍 예제 | [자바 기초 26] 연습문제

자바를 통한 객체지향 연습문제를 풀어봅시다. 도서구매: http://www.yes24.com/Product/Goods/104740689 강의자료: https://cloudstudying.kr/courses/61

+ 여기를 클릭

Source: ru.taphoamini.com

Date Published: 10/9/2022

View: 7373

[Java] 객체지향(2) 연습 정리 – 챙’s Story – 티스토리

회원이 대여한 비디오 출력 예제(캡슐화). Veo.java public Veo { //veo 관련 멤버변수 private String num; private String title; …

+ 여기에 보기

Source: chaengstory.tistory.com

Date Published: 3/9/2021

View: 9294

[문제] 자바의 정석 Chapter 6 객체지향 프로그래밍 1 연습문제 …

[문제] 자바의 정석 Chapter 6 객체지향 프로그래밍 1 연습문제 및 해답정리 · # Chapter 6 : 객체지향 프로그래밍 1 · Q1. 다음과 같은 멤버변수를 갖는 SutdaCard클래스를 …

+ 여기에 보기

Source: coderbear.tistory.com

Date Published: 9/1/2021

View: 7975

주제와 관련된 이미지 자바 객체 지향 연습 문제

주제와 관련된 더 많은 사진을 참조하십시오 [자바 기초 26] 연습문제: 객체지향. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[자바 기초 26] 연습문제: 객체지향
[자바 기초 26] 연습문제: 객체지향

주제에 대한 기사 평가 자바 객체 지향 연습 문제

  • Author: 홍팍
  • Views: 조회수 3,328회
  • Likes: 좋아요 37개
  • Date Published: 2018. 7. 4.
  • Video Url link: https://www.youtube.com/watch?v=A7xIi5KYICo

연습문제 D – 객체지향 프로그래밍

연습문제 D – 객체지향 프로그래밍

# 연습문제 D – 객체지향 프로그래밍 ## 09 클래스와 객체 — ### 이론 요약 ![클라우드스터딩-자바-클래스와-객체-요약](https://i.imgur.com/zi6B90d.png) #### 객체 지향 프로그래밍 – OOP라고 한다. 프로그램을 객체의 조립으로 만드는 방식이다. – OOP는 프로그램의 관리/재사용/확장에 좋다. #### 클래스 vs 객체 – 클래스는 객체를 만들기 위한 설계도이다. – 객체의 또 다른 표현으로는 인스턴스(instance)가 있다. – 때문에 클래스로 객체를 만드는 것을 “인스턴스화”라고 한다. #### 클래스 설계 및 구현 – 클래스는 필드(상태)와 메소드(동작)로 구성된다. – 클래스를 도식화한 것을 “클래스 다이어그램”이라 한다. – 클래스 다이어그램 보고 코드를 작성할 줄 알아야 한다. ### 실습 리뷰 정사각형 객체의 넓이를 구하는 예. “` public class SquareTest { public static void main(String[] args) { /* 1. 객체 생성 */ Square s = new Square(); /* 2. 필드 초기화(값 변경) */ s.length = 4; /* 3. 결과 출력 */ System.out.printf(“한 변의 길이가 %d인 정사각형의 넓이: %d”, s.length, s.area()); } } /* 4. 정사각형 클래스 구현 */ class Square { int length; // 길이 // 넓이 반환 int area() { return length * length; } } “` ## 10 생성자 — ### 이론 요약 ![클라우드스터딩-자바-생성자-요약](https://i.imgur.com/pMmmkPn.png) #### 생성자 – 생성자는 객체를 만드는 특별한 메소드다. – 생성자는 역할은, 객체 생성과 필드 초기화이다. #### 생성자 특징 – 생성자는, 호출과 정의로 나뉜다. – 생성자명은, 클래스명과 같아야 한다. – 리턴 타입은 표기하지 않는다. (void 아님) ### 실습 리뷰 마린과 메딕 객체의 상호 작용 “` public class Starcraft { public static void main(String[] args) { // 객체 생성 Marine marine = new Marine(“마린”, 80); Medic medic = new Medic(“메딕”, 60); // 마린 스팀팩 버프~ marine.stimpack(); // 메딕의 치료 -> 마린 medic.heal(marine); } } // 마린 클래스 class Marine { // 필드 String name; int hp; // 생성자 public Marine(String name, int hp) { this.name = name; this.hp = hp; } // 메소드 public void stimpack() { System.out.printf(“[%s]의 스팀팩! HP: %d -> “, name, hp); hp -= 10; System.out.printf(“%d

“,hp); } } // 메딕 클래스 class Medic { // 필드 String name; int hp; // 생성자 public Medic(String name, int hp) { this.name = name; this.hp = hp; } // 메소드 public void heal(Marine target) { System.out.printf(“[%s]의 치유! %s HP(%d -> “, name, target.name, target.hp); target.hp += 10; System.out.printf(“%d)

“, target.hp); } } “` ## 11 레퍼런스 변수와 static — ### 이론 요약 ![클라우드스터딩-자바-레퍼런스와-static-요약](https://i.imgur.com/8SjXUXO.png) #### 레퍼런스 변수 – 레퍼런스 변수란, 객체를 가리키는 변수다. – 기본형 변수는 값을 직접 저장하나, 레퍼런스 변수는 객체의 위치를 가리킨다. #### static 키워드 – static 키워드는 필드와 메소드에 적용될 수 있다. #### 클래스 변수 – 클래스 변수란, 클래스 영역에 존재한다. – 인스턴스 변수란, 객체 내부에 존재한다. #### 인스턴스 변수 – 클래스 메소드란, 주체 객체가 없이 수행되는 메소드다. – 인스턴스 메소드란, 주체 객체가 실행하는 메소드다. ### 실습 리뷰 두 점 사이의 거리 “` public class PointTest { public static void main(String[] args) { // 객체 생성 Point p1 = new Point(0, 0); Point p2 = new Point(3, 4); // 거리 계산 double dist = Point.distance(p1, p2); // 결과 출력 System.out.printf(“두 점 A%s, B%s 사이의 거리: %.2f”, p1.toStr(), p2.toStr(), dist); } } class Point { int x; int y; Point (int _x, int _y) { x = _x; y = _y; } String toStr() { return String.format(“(%d, %d)”, x, y); } static double distance(Point p, Point q) { double dX = p.x – q.x; // x좌표의 변화량 double dY = p.y – q.y; // y좌표의 변화량 return Math.sqrt((dX * dX) + (dY * dY)); } } “` ## 확인하기 —

## 도서구매

[자바의정석] 객체지향 연습문제 6-1, 6-2

학원에서 JAVA 진도를 나가기 시작했다. 객체지향 이전 연산자,배열등은 어느정도 이해했으니 어려운 객체지향 문제들을 풀어보면서 계속 이해해보려 한다.

1번 문제

정답

class SutdaCard { int num ; boolean isKwang ; }

이런건 뭐 easy- 하다

2번 문제

정답

메인 메서드

package practice ; public class oop6_1 { public static void main ( String [ ] args ) { SutdaCard card1 = new SutdaCard ( 3 , false ) ; SutdaCard card2 = new SutdaCard ( ) ; System . out . println ( card1 . info ( ) ) ; System . out . println ( card2 . info ( ) ) ; } }

클래스

class SutdaCard { int num ; boolean isKwang ; SutdaCard ( ) { this ( 1 , true ) ; } SutdaCard ( int num , boolean isKwang ) { this . num = num ; this . isKwang = isKwang ; } String info ( ) { return num + ( isKwang ? “K” : ” ” ) ; } }

정답 해설은 아래의 그림을 보며 이해해보자

8번라인에는 내가 원하는 값들을

9번라인에선 기본 세팅된 값을 설정해주었다.

8번라인에서 설정해준 값은 23번에 생성한 파라미터 값에 각각 대입되어 SutdaCard 클래스 속성에 입력된다.

9번 라인에서는 설정해준 값이 없기 때문에 기본생성자에 세팅해준 기본 값으로 설정이 된다.

그리고 실제 출력시키는 11,12번 라인을 보면 info()메서드를 거쳐 출력이 된다.

String info ( ) { return num + ( isKwang ? “K” : ” ” ) ; }

처음에는 void개념을 까먹어서 무작정 void info() 를 썼는데

다시 검색해보니 void는 return값이 필요 없을때 사용을 하지만,

위 메서드는 return 값을 받아야 하기 때문에, void를 쓰지 않고

내가 원하는 타입을 지정해주어야 한다.

근데 난 int와 boolean값을 리턴해야 하는데

int info()를 쓰면 boolean에서 에러가뜨고

boolean info()를 쓰면 int에서 에러가떠서

어떻게 해결해야 할까 하다가 String으로 형변환을 하면 되겠구나 라고 생각했다 (답지 봄)

isKwang이 true일 경우 K문자가 붙어서 나오고

false일 경우 K문자가 안붙어 나오도록 삼항 연산자를 사용해서 값을 출력해 냈다.

딩동댕동

[Java] 부록(1) 객체지향 프로그래밍 연습문제

위 글은 해당 카테고리의 수업 강의 자료(연습문제)를 정리한 것입니다.

손이 가는대로 무지성으로 푼 것도 많아서… 풀었던 문제 정리하면서 객체지향을 이해하는게 나은 것 같아 작성

(연습문제, Pratice03~05 부분)

package com.javaex.problem01; public class Member { private String id; private String name; private int point; public Member() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPoint() { return point; } public void setPoint(int point) { this.point = point; } public Member(String id, String name, int point) { super(); this.id = id; this.name = name; this.point = point; } public void Draw() { System.out.println(id+ ” “+name+” “+point); } @Override public String toString() { return “Member [id=” + id + “, name=” + name + “, point=” + point + “]”; } }

public class MemberApp { public static void main(String[] args) { // TODO Auto-generated method stub Member m = new Member(“20172829”, “지현정”, 20172829); m.Draw(); // m.toString(); XXXX // toString은 문자열만 반환하므로 System.out.println(변수명.toString()) System.out.println(m.toString()); } }

public class Base { public void service(String state) { if(state.equals(“낮”)) day(); else if(state.equals(“오후”)) afternoon(); else night(); } public void day() { System.out.println(“낮에도 일해”); } public void night() { System.out.println(“밤에도 일해”); } public void afternoon() { System.out.println(“오후에도 일해”); } }

public class BaseApp { public static void main(String[] args) { // TODO Auto-generated method stub Base b = new Base(); b.service(“낮”); b.service(“밤”); b.service(“오후”); } }

public class Print { public void print(boolean bool) { System.out.println(bool); } public void print(String str) { System.out.println(str); } public void print(int num) { System.out.println(num); } public void print(double number) { System.out.println(number); } }

public class PrintApp { public static void main(String[] args) { // TODO Auto-generated method stub Print print = new Print(); print.print(10); print.print(true); print.print(5.7); print.print(“홍길동”); }

public class CConverter { public static double rate; public static void setRate(double r){ CConverter.rate = r; } public static double toDoller(double won){ return won / rate; } public static double toKRW(double dollar){ return dollar * rate; } }

public class CConverterApp { public static void main(String[] args) { double dollar = 1000000; double won = 100; CConverter.setRate(1229.40); System.out.println(“백만원은 ” + CConverter.toDoller(dollar) + ” 달러입니다.”); System.out.println(“백달러는”+ CConverter.toKRW(won) + “원입니다.”); } }

public class StringUtil { private static String str=””; public static String concatString(String[] strArray) { for(int i=0; i array로 넘어감… 명시 String[] arr1 = str1.split(” “); String[] arr2 = str2.split(” “); String[] arr3 = str3.split(” “); // Friend 객체 생성하여 데이터 넣기 -> 생성자 호출 -> 객체 생성 Friend f1 = new Friend(arr1[0], arr1[1], arr1[2]); Friend f2 = new Friend(arr2[0], arr2[1], arr2[2]); Friend f3 = new Friend(arr3[0], arr3[1], arr3[2]); // 배열에 추가하기 ( friendArray <- friend객체 ) friendArray[0] = f1; friendArray[1] = f2; friendArray[2] = f3; // 친구정보 출력 for (int i = 0; i < friendArray.length; i++) { //친구정보 출력 메소드 호출 friendArray[i].showInfo(); } sc.close(); } } public class Account { private String accountNo; private int balance; //생성자 작성 public Account(String accountNo) { // TODO Auto-generated constructor stub System.out.println(accountNo + " 계좌가 개설되었습니다."); } //필요한 메소드 작성 public void deposit(int money) { // TODO Auto-generated method stub balance += money; } public void withdraw(int money) { balance -= money; } public void showBalance() { // TODO Auto-generated method stub System.out.println(balance); } } import java.util.Scanner; public class AccountApp { public static void main(String[] args) { Scanner sc = new Scanner(System.in); boolean run = true; int money; Account account = new Account("312-89562-123456"); while(run){ System.out.println(""); System.out.println("----------------------------"); System.out.println("1.예금 | 2.출금 | 3.잔고 |4.종료"); System.out.println("----------------------------"); System.out.print("선택>“); int menuNo = sc.nextInt(); switch(menuNo){ case 1: System.out.print(“예금액>”); money = sc.nextInt(); account.deposit(money); break; case 2: System.out.print(“출금액>”); money= sc.nextInt(); account.withdraw(money); break; case 3: System.out.print(“잔고액>”); account.showBalance(); break; case 4: System.out.print(“프로그램 종료”); run = false; break; default : System.out.println(“다시입력해주세요”); break; }//switch }//while sc.close(); } }

public class Book { private int bookNo; private String title; private String author; private int stateCode; public Book(int bookNo, String title, String author) { // TODO Auto-generated constructor stub this.bookNo = bookNo; this.title = title; this.author = author; stateCode = 1; // this.stateCode = stateCode; } public void rent() { stateCode = 0; } public void print() { if(stateCode == 0) System.out.println(bookNo+” 책 제목: “+ title+” 저자: “+ author+ ” 대여 유무: 대여 중”); else System.out.println(bookNo+” 책 제목: “+ title+”, 저자: “+ author+ “, 대여 유무: 재고 있음”); } }

import java.util.Scanner; public class BookShop { public static void main(String[] args) { Book[] books = new Book[10]; books[0] = new Book(1, “트와일라잇”, “스테파니메이어”); books[1] = new Book(2, “뉴문”, “스테파니메이어”); books[2] = new Book(3, “이클립스”, “스테파니메이어”); books[3] = new Book(4, “브레이킹던”, “스테파니메이어”); books[4] = new Book(5, “아리랑”, “조정래”); books[5] = new Book(6, “젊은그들”, “김동인”); books[6] = new Book(7, “아프니깐 청춘이다”, “김난도”); books[7] = new Book(8, “귀천”, “천상병”); books[8] = new Book(9, “태백산맥”, “조정래”); books[9] = new Book(10, “풀하우스”, “원수연”); System.out.println(“*****도서 정보 출력하기******”); displayBookInfo(books); Scanner scanner = new Scanner(System.in); System.out.print(“대여 하고 싶은 책의 번호를 입력하세요:”); int num = scanner.nextInt(); scanner.close(); // (1) 입력된 번호에 맞는 책을 찾아 대여 되었음(상태코드=0)을 체크 합니다. books[num-1].rent(); System.out.println(“*****도서 정보 출력하기******”); displayBookInfo(books); } //(2)전달받은 배열을 모두 출력하는 메소드 private static void displayBookInfo(Book[] books) { //코드작성 for(int i=0; i> “); Scanner sc = new Scanner(System.in); int a=0; String sign = “”; int b=0; try { a = sc.nextInt(); sign = sc.next(); b = sc.nextInt(); } catch(InputMismatchException e) { System.out.println(“종료합니다..”); break; } switch(sign) { case “+”: Add add = new Add(); add.setValue(a,b); System.out.println(“>> “+add.calculate()); break; case “-“: Sub sub = new Sub(); sub.setValue(a, b); System.out.println(“>> “+sub.calculate()); break; case “*”: Mul mul = new Mul(); mul.setValue(a,b); System.out.println(“>> “+mul.calculate()); break; case “/”: Div div = new Div(); div.setValue(a,b); System.out.println(“>> “+div.calculate()); break; default: System.out.println(“알 수 없는 연산입니다.”); break; } } } }

연습문제 풀이] Chapter6 객체지향 프로그래밍1

[6-1] 다음과 같은 멤버변수를 갖는 SutdaCard클래스를 정의하시오.

카드의 숫자. (1~10사이의 정수)

답:

[6-2] 문제 6-1에서 정의한 SutdaCard클래스에 두 개의 생성자와 info()를 추가해서 실행결과와 같은 결과를 얻도록 하시오.

답 :

(1) int num; boolean isKwang;

public SutdaCard(){ this(1, true); //SutdaCard(1,true)를 호출한다. }

public SutdaCard(int num, boolean isKwang){ this.num = num; this.isKwang = isKwang; }

public String info(){ return num + (isKwang ? “K” : “”); }

[6-3] 다음과 같은 멤버변수를 갖는 Sutdent클래스를 정의하시오.

타입 변수명 설명 String name 학생이름 int ban 반 int no 번호 int kor 국어점수 int eng 영어점수 int math 수학점수

답:

public class Exercise6_3 { String name; int ban; int no; int kor; int eng; int math; }

[6-4] 문제 6-3에서 정의한 Student클래스에 다음과 같이 정의된 두 개의 메서드 getTotal()과 getAverage()를 추가하시오.

1. 메서드명 : getTotal 기능 : 국어(kor), 영어(eng), 수학(math)의 점수를 모두 더해서 반환한다. 반환타입 : int 매개변수 : 없음

2. 메서드명 : getAverage 기능 : 총점(국어점수+영어점수+수학점수)을 과목수로 나눈 평균을 구한다. 소수점 둘째자리에서 반올림할 것. 반환타입 : float 매개변수 : 없음

class Exercise6_4 { public static void main(String args[]) { Student s = new Student(); s.name = “홍길동”; s.ban = 1; s.no = 1; s.kor = 100; s.eng = 60; s.math = 76; System.out.println(“이름 :”+s.name); System.out.println(“총점 :”+s.getTotal()); System.out.println(“평균 :”+s.getAverage()); } } class Student { /* (1) 알맞은 코드를 넣어 완성하시오. */ } [실행결과] 이름 : 홍길동 총점 : 236 평균 : 78.7

답 : (1) String name; int ban; int no; int kor; int eng; int math;

public int getTotal() { return kor + eng + math; }

public float getAverage(){ return Math.round(getTotal() / 3f * 100)/100f; }

[6-5] 다음과 같은 실행결과를 얻도록 Student클래스에 생성자와 info()를 추가하시오.

class Exercise6_5 { public static void main(String args[]) { Student s = new Student(“홍길동”,1,1,100,60,76); System.out.println(s.info()); } } class Student { /* 알맞은 코드를 넣어 완성하시오 (1) . */ } [실행결과] 홍길동,1,1,100,60,76,236,78.8

답 :

public Student(String name, int ban, int no, int kor, int eng, int math) { super(); this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; }

public String info() { return name + “,” + ban + “,” + no + “,” + kor + “,” + eng + “,” + math+ “,” + getTotal() + “,” + getAverage(); }

[6-6] 두 점의 거리를 계산하는 getDistance()를 완성하시오. ([Hint] 제곱근 계산은 Math.sqrt(double a)를 사용하면 된다.)

class Exercise6_6 { // 두 점 (x,y)와 (x1,y1)간의 거리를 구한다. static double getDistance(int x, int y, int x1, int y1) { /* (1)알맞은 코드를 넣어 완성하시오 . */ } public static void main(String args[]) { System.out.println(getDistance(1, 1, 2, 2)); } } [실행결과] 1.4142135623730951

답 :

(1) return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));

[6-7] 문제6-6에서 작성한 클래스메서드 getDistance()를 MyPoint클래스의 인스턴스메서드로 정의하시오.

class MyPoint { int x; int y; MyPoint(int x, int y) { this.x = x; this.y = y; } /* * (1) 인스턴스메서드 getDistance를 작성하시오. */ } class Exercise6_7 { public static void main(String args[]) { MyPoint p = new MyPoint(1, 1); // p와 (2,2)의 거리를 구한다. System.out.println(p.getDistance(2, 2)); } } [실행결과] 1.4142135623730951

답 :

(1) public double getDistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); }

static 메서드 vs. 인스턴스 메서드 (6-6문제) static 메서드의 경우에는 메서드 내에서 인스턴스 변수를 사용하지 않았다. 대신 매개변수(지역변수)로 작업에 필요한 값을 제공받아야했다. 그래서, 인스턴스와 관계가 없으므로(인스턴스변수를 사용하지 않았으니까) static메서드로 선언할 수 있는 것이다. (6-7문제) 그러나, 인스턴스 메서드는 인스턴스 변수 x, y를 사용해서 작업하므로 매개변수로 x1과 y1만을 제공받으면 된다. 인스턴스와 관계가 있으므로(인스턴스 변수를 사용했으니까) static을 붙일 수 없다.

[6-8] 다음의 코드에 정의된 변수들을 종류별로 구분해서 적으시오.

class PlayingCard { int kind; int num;

static int width; static int height;

PlayingCard(int k, int n) { kind = k; num = n; }

public static void main(String args[]) { PlayingCard card = new PlayingCard(1,1); } }

답:

– 클래스변수 (static변수) : width, height

– 인스턴스변수 : kind, num

– 지역변수 : k, n, card, args

변수가 선언된 위치를 보면 변수의 종류를 알 수 있다. 클래스 블럭 내에 선언된 변수는 인스턴스 변수이고, static이 붙은 것은 static변수(클래스 변수)이다. 그리고 나머지는 모두 지역변수이다.

[6-9] 다음은 컴퓨터 게임의 병사(marine)를 클래스로 정의한 것이다. 이 클래스의 멤버 중에 static을 붙여야 하는 것은 어떤 것들이고 그 이유는 무엇인가? (단, 모든 병사의 공격력과 방어력은 같아야 한다.)

class Marine { int x=0, y=0; //Marine의 위치좌표 (x,y) int hp = 60; //현재 체력 int weapon = 6; //공격력 int armor = 0; //방어력 void weaponUp() { weapon++; } void armorUp() { armor++; } void move(int x, int y) { this.x = x; this.y = y; } }

답 : weapon, armor ; 모든 병사의 공격력과 방어력이 같아야 하기 때문에 공유가 가능하도록 static을 붙여야 한다.

+ weaponUp(), armorUp() – static변수에 대한 작업을 하는 메서드이므로

[6-10] 다음 중 생성자에 대한 설명으로 옳지 않은 것은? (모두 고르시오)

a. 모든 생성자의 이름은 클래스의 이름과 동일해야한다.

b. 생성자는 객체를 생성하기 위한 것이다.

→ 생성자가 객체를 생성할 때 사용되기는 하지만, 객체를 초기화할 목적으로 사용되는 것이다.

객체를 생성하는 것은 new연산자이다.

c. 클래스에는 생성자가 반드시 하나 이상 있어야 한다.

d. 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다.

e. 생성자는 오버로딩 할 수 없다.

답: b, e

[6-11] 다음 중 this에 대한 설명으로 맞지 않은 것은? (모두 고르시오)

a. 객체 자신을 가리키는 참조변수이다.

b. 클래스 내에서라면 어디서든 사용할 수 있다.

→ 인스턴스메서드에서만 사용가능. 클래스 멤버(static이 붙은 변수나 메서드)에는 사용할 수 없다.

c. 지역변수와 인스턴스변수를 구별할 때 사용한다.

d. 클래스 메서드 내에서는 사용할 수 없다.

답: b

[6-12] 다음 중 오버로딩이 성립하기 위한 조건이 아닌 것은? (모두 고르시오)

a. 메서드의 이름이 같아야 한다.

b. 매개변수의 개수나 타입이 달라야 한다.

c. 리턴타입이 달라야 한다.

→ 리턴타입은 오버로딩에 영향을 주지 못한다.

d. 매개변수의 이름이 달라야 한다.

답: c, d

오버로딩의 조건

1. 메서드 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입이 달라야 한다. 3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

[6-13] 다음 중 아래의 add메서드를 올바르게 오버로딩 한 것은? (모두 고르시오)

long add(int a, int b) { return a+b; }

a. long add(int x, int y) { return x+y; }

b. long add(long a, long b) { return a+b; }

c. int add(byte a, byte b) { return a+b; }

d. int add(long a, int b) { return (int)(a+b); }

답: b, c, d

[6-14] 다음 중 초기화에 대한 설명으로 옳지 않은 것은? (모두 고르시오)

a. 멤버변수는 자동 초기화되므로 초기화하지 않고도 값을 참고할 수 있다.

b. 지역변수는 사용하기 전에 반드시 초기화해야 한다.

c. 초기화 블럭보다 생성자가 먼저 수행된다.

→ 초기화 블럭이 먼저 수행된다.

d. 명시적 초기화를 제일 우선적으로 고려해야 한다.

e. 클래스변수보다 인스턴스변수가 먼저 초기화된다.

→ 클래스변수가 먼저 초기화된다.

답 : c, e

클래스 변수는 클래스가 처음 메모리에 로딩될 때, 자동 초기화되므로 인스턴스 변수보다 먼저 초기화된다. 그리고 생성자는 초기화 블럭이 수행된 다음에 수행된다.

[6-15] 다음 중 인스턴스변수의 초기화 순서가 올바른 것은?

a. 기본값-명시적초기화-초기화블럭-생성자

b. 기본값-명시적초기화-생성자-초기화블럭

c. 기본값-초기화블럭-명시적초기화-생성자

d. 기본값-초기화블럭-생성자-명시적초기화

답 : a

변수의 초기화 순서 클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화된다. 인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.

클래스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭 인스턴스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자

[6-16] 다음 중 지역변수에 대한 설명으로 옳지 않은 것은? (모두 고르시오)

a. 자동 초기화되므로 별도의 초기화가 필요없다.

→ 지역변수는 자동 초기화 되지 않기 때문에 사용하기 전에 반드시 적절한 값으로 초기화를 해주어야한다.

b. 지역변수가 선언된 메서드가 종료되면 지역변수도 함께 소멸된다.

c. 메서드의 매개변수로 선언된 변수도 지역변수이다.

d. 클래스변수나 인스턴스변수보다 메모리 부담이 적다.

→ 지역변수는 자신이 선언된 블럭이나 메서드가 종료되면 소멸되므로 메모리 부담이 적다.

e. 힙(heap)영역에 생성되며 가비지 컬렉터에 의해 소멸된다.

→ 힙영역에는 인스턴스(인스턴스변수)가 생성되는 영역이며, 지역변수는 호출스택(call stack)에 생성된다.

답 : a, e

[6-17] 호출스택이 다음과 같은 상황일 때 옳지 않은 설명은? (모두 고르시오)

a. 제일 먼저 호출스택에 저장된 것은 main메서드이다.

b. println메서드를 제외한 나머지 메서드들은 모두 종료된 상태이다.

→ 호출스택의 제일 위에 있는 메서드가 현재 수행중인 메서드이며, 호출스택 안의 나머지 메서드들은 대기상태이다.

c. method2메서드를 호출한 것은 main메서드이다.

d. println메서드가 종료되면 method1메서드가 수행을 재개한다.

e. main-method2-method1-println의 순서로 호출되었다.

f. 현재 실행중인 메서드는 println뿐이다.

답: b

[6-18] 다음의 코드를 컴파일하면 에러가 발생한다. 컴파일 에러가 발생하는 라인과 그 이유를 설명하시오.

class MemberCall { int iv = 10; static int cv = 20;

int iv2 = cv; static int cv2 = iv; // 라인 A

static void staticMethod1() { System.out.println(cv); System.out.println(iv); // 라인 B }

void instanceMethod1() { System.out.println(cv); System.out.println(iv); //라인 C } static void staticMethod2() { staticMethod1(); instanceMethod1(); //라인 D } void instanceMethod2() { staticMethod1(); //라인 E instanceMethod1(); } }

답 : 라인 A, 라인 B, 라인 D

라인A – static 변수의 초기화에 인스턴스변수를 사용할 수 없다.

꼭 사용해야한다면, 객체를 생성해야한다.

라인B – static메서드에서는 인스턴스변수를 사용할 수 없다.

라인D – static메서드에서는 인스턴스메서드를 사용할 수 없다.

[6-19] 다음 코드의 실행 결과를 예측하여 적으시오.

class Exercise6_19 { public static void change(String str) { str += “456”; }

public static void main(String[] args) { String str = “ABC123”; System.out.println(str); change(str); System.out.println(“After change:” + str); } }

답 :

ABC123 After change: ABC123

해설 : str은 change메서드의 지역변수이므로 change메서드가 종료되면 str역시 메모리에서 제거된다.

[6-20] 다음과 같이 정의된 메서드를 작성하고 테스트하시오. ([주의] Math.random()을 사용하는 경우 실행결과와 다를 수 있음.)

메서드명 : shuffle 기능 : 주어진 배열에 담긴 값의 위치를 바꾸는 작업을 반복하여 뒤섞이게 한다. 처리한 배열을 반환한다. 반환타입 : int[] 매개변수 : int[] arr – 정수값이 담긴 배열

class Exercise6_20 { /* * (1) shuffle 메서드를 작성하시오. * */ public static void main(String[] args) { int[] original = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; System.out.println(java.util.Arrays.toString(original));

int[] result = shuffle(original); System.out.println(java.util.Arrays.toString(result)); } }

답:

public static int[] shuffle(int[] arr) {

for (int i = 0; i < arr.length; i++) { int j = (int)Math.random() % arr.length; int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } return arr; } [6-21] Tv클래스를 주어진 로직대로 완성하시오. 완성한 후에 실행해서 주어진 실행결과와 일치하는지 확인하라. ([참고] 코드를 단순히 하기 위해서 유효성검사는 로직에서 제외했다.) class MyTv { boolean isPowerOn; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; void turnOnOff() { // (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다. } void volumeUp() { // (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1 증가시킨다. } void volumeDown() { // (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1 감소시킨다. } void channelUp() { // (4) channel의 값을 1 증가시킨다. // 만일 channel이 MAX_CHANNEL이면 , channel의 MIN_CHANNEL 값을 로 바꾼다. } void channelDown() { // (5) channel의 값을 1 감소시킨다 . // 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX_CHANNEL 로 바꾼다. } } class Exercise6_21 { public static void main(String args[]) { MyTv t = new MyTv(); t.channel = 100; t.volume = 0; System.out.println("CH:" + t.channel + ", VOL:" + t.volume); t.channelDown(); t.volumeDown(); System.out.println("CH:" + t.channel + ", VOL:" + t.volume); t.volume = 100; t.channelUp(); t.volumeUp(); System.out.println("CH:" + t.channel + ", VOL:" + t.volume); } } [실행결과] CH: 100, VOL: 0 CH: 99, VOL: 0 CH: 100, VOL: 100 답 : (1) isPowerOn = !isPowerOn; (2) if(volume < MAX_VOLUME) volume++; (3) if(volume > MIN_VOLUME) volume–; (4) if(channel == MAX_CHANNEL) channel = MIN_CHANNEL; else channel++; (5) if(channel == MIN_CHANNEL) channel = MAX_CHANNEL; else channel–;

[6-22] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

메서드명 : isNumber 기능 : 주어진 문자열이 모두 숫자로만 이루어져있는지 확인한다. 모두 숫자로만 이루어져있으면 true를 반환하고, 그렇지 않으면 false를 반환한다. 만일 주어진 문자열이 null이거나 빈문자열 “”이라면 false를 반환한다. 반환타입 : boolean 매개변수 : String str – 검사할 문자열

([Hint] String클래스의 charAt(int i)메서드를 사용하면 문자열의 i번째 위치한 문자를 얻을 수 있다.)

class Exercise6_22 { /* (1) isNumber 메서드를 작성하시오. */ public static void main(String[] args) { String str = “123”; System.out.println(str + ” 는 숫자입니까? ” + isNumber(str)); str = “1234o”; System.out.println(str + ” 는 숫자입니까? ” + isNumber(str)); } }

[실행결과] 123는 숫자입니까? true 1234o는 숫자입니까? false

답 :

public static boolean isNumber(String str){ boolean ret = true; for(int i =0;i < str.length(); i++){ if(str.charAt(i)>=’0′ && str.charAt(i)<='9') continue; else { ret = false; break; } } return ret; } [6-23] 다음과 같이 정의된 메서드를 작성하고 테스트하시오. 메서드명 : max 기능 : 주어진 int형 배열의 값 중에서 제일 큰 값을 반환한다. 만일 주어진 배열이 null이거나 크기가 0인 경우, -999999를 반환한다. 반환타입 : int 매개변수 : int[] arr - 최대값을 구할 배열 class Exercise6_23 { /* (1) max 메서드를 작성하시오 . */ public static void main(String[] args) { int[] data = {3,2,9,4,7}; System.out.println(java.util.Arrays.toString(data)); System.out.println("최대값 :"+max(data)); 최대값 System.out.println(" :"+max(null)); System.out.println("최대값 :"+max(new int[]{})); // 크기가 0인 배열 } } } [실행결과] [3, 2, 9, 4, 7] 최대값: 9 최대값: -999999 최대값: -999999 답 : public static int max(int[] arr){ if(arr == null || arr.length == 0){ return -999999; } int maxVal = arr[0]; for(int i = 1; i < arr.length; i++){ maxVal = (maxVal >= arr[i]) ? maxVal : arr[i]; } return maxVal; }

[6-24] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

자바 객체 지향 연습 문제 | [자바 기초 26] 연습문제: 객체지향 8260 좋은 평가 이 답변

당신은 주제를 찾고 있습니까 “자바 객체 지향 연습 문제 – [자바 기초 26] 연습문제: 객체지향“? 다음 카테고리의 웹사이트 you.dianhac.com.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.dianhac.com.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 홍팍 이(가) 작성한 기사에는 조회수 3,227회 및 좋아요 36개 개의 좋아요가 있습니다.

자바 객체 지향 연습 문제 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [자바 기초 26] 연습문제: 객체지향 – 자바 객체 지향 연습 문제 주제에 대한 세부정보를 참조하세요

자바를 통한 객체지향 연습문제를 풀어봅시다.

도서구매: http://www.yes24.com/Product/Goods/104740689

강의자료: https://cloudstudying.kr/courses/61

실습문제: https://cloudstudying.kr/lectures/200#tab

강의문의: [email protected]

카톡ID: chaesam

자바 객체 지향 연습 문제 주제에 대한 자세한 내용은 여기를 참조하세요.

연습문제 D – 객체지향 프로그래밍 – 클라우드스터딩

이론 요약. 클라우드스터딩-자바-클래스와-객체-요약. 객체 지향 프로그래밍. OOP라고 한다. 프로그램을 객체의 …

+ 자세한 내용은 여기를 클릭하십시오

Source: cloudstudying.kr

Date Published: 6/6/2022

View: 6260

[자바의정석] 객체지향 연습문제 6-1, 6-2 – velog

학원에서 JAVA 진도를 나가기 시작했다. 객체지향 이전 연산자,배열등은 어느정도 이해했으니 어려운 객체지향 문제들을 풀어보면서 계속 이해해보려 …

+ 여기에 더 보기

Source: velog.io

Date Published: 7/10/2021

View: 2294

[Java의 정석_연습문제 풀이] Chapter6 객체지향 프로그래밍1

[Java의 정석_연습문제 풀이] Chapter6 객체지향 프로그래밍1 … [6-2] 문제 6-1에서 정의한 SutdaCard클래스에 두 개의 생성자와 info()를 추가해서 …

+ 더 읽기

Source: developer-ek.tistory.com

Date Published: 7/6/2022

View: 527

[Java] 부록(1) 객체지향 프로그래밍 연습문제 – Devlog

[Java] 부록(1) 객체지향 프로그래밍 연습문제. 덩이 2022. 3. 14. 21:46. 위 글은 해당 카테고리의 수업 강의 자료(연습문제)를 정리한 것입니다.

+ 여기에 보기

Source: devlog2829.tistory.com

Date Published: 7/5/2022

View: 8701

[문제] 자바의 정석 Chapter 6 객체지향 프로그래밍 1 연습문제 …

[문제] 자바의 정석 Chapter 6 객체지향 프로그래밍 1 연습문제 및 해답정리 · # Chapter 6 : 객체지향 프로그래밍 1 · Q1. 다음과 같은 멤버변수를 갖는 SutdaCard클래스를 …

+ 자세한 내용은 여기를 클릭하십시오

Source: coderbear.tistory.com

Date Published: 10/5/2021

View: 8332

04장 연습문제 – 점프 투 자바

04장 연습문제. (연습문제 풀이 : https://wikocs.net/157712#04) … 이전글 : 04-05 for each 문; 다음글 : 05장 객체지향 프로그래밍.

+ 여기에 보기

Source: wikidocs.net

Date Published: 12/30/2021

View: 4326

자바의 정석 7장 (19일차) – 7장 연습문제 (객체지향 2)

섯다카드 클래스 자체를 array로 지정하여 선언; 지정한 후 if로 조건문을 선언하여 숫자 조건 추가; 숫자를 배정할 때 객체를 선언하여 그 멤버변수 …

+ 여기에 자세히 보기

Source: timmer.tistory.com

Date Published: 6/11/2022

View: 1445

객체지향 프로그래밍 연습 문제 – 공대생의 it

공대생 it 님의 블로그입니다. 구독하기. 프로필 사진. 코드를 통해 본 빵형의 실전자바의 다른 글.

+ 여기를 클릭

Source: tnrn211.tistory.com

Date Published: 12/8/2022

View: 177

[Java] 객체지향(2) 연습 정리 – 챙’s Story

회원이 대여한 비디오 출력 예제(캡슐화). Veo.java public Veo { //veo 관련 멤버변수 private String num; private String title; …

+ 여기에 자세히 보기

Source: chaengstory.tistory.com

Date Published: 2/29/2022

View: 7355

[Java] 객체 간 협력, 교통수단 예제문제 / 2021.07.26

이 예제에서는 학생이 버스, 지하철, 택시를 타고 가는 것을 객체 지향 프로그래밍해보겠다. (1) 학생 클래스 구현하기 학생 클래스는 “이름”, “가진 돈” …

+ 자세한 내용은 여기를 클릭하십시오

Source: cow-kite24.tistory.com

Date Published: 6/2/2022

View: 3592

주제와 관련된 이미지 자바 객체 지향 연습 문제

주제와 관련된 더 많은 사진을 참조하십시오 [자바 기초 26] 연습문제: 객체지향. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[자바 기초 26] 연습문제: 객체지향

주제에 대한 기사 평가 자바 객체 지향 연습 문제

Author: 홍팍

Views: 조회수 3,227회

Likes: 좋아요 36개

Date Published: 2018. 7. 4.

Video Url link: https://www.youtube.com/watch?v=A7xIi5KYICo

연습문제 D – 객체지향 프로그래밍

연습문제 D – 객체지향 프로그래밍 # 연습문제 D – 객체지향 프로그래밍 ## 09 클래스와 객체 — ### 이론 요약 ![클라우드스터딩-자바-클래스와-객체-요약](https://i.imgur.com/zi6B90d.png) #### 객체 지향 프로그래밍 – OOP라고 한다. 프로그램을 객체의 조립으로 만드는 방식이다. – OOP는 프로그램의 관리/재사용/확장에 좋다. #### 클래스 vs 객체 – 클래스는 객체를 만들기 위한 설계도이다. – 객체의 또 다른 표현으로는 인스턴스(instance)가 있다. – 때문에 클래스로 객체를 만드는 것을 “인스턴스화”라고 한다. #### 클래스 설계 및 구현 – 클래스는 필드(상태)와 메소드(동작)로 구성된다. – 클래스를 도식화한 것을 “클래스 다이어그램”이라 한다. – 클래스 다이어그램 보고 코드를 작성할 줄 알아야 한다. ### 실습 리뷰 정사각형 객체의 넓이를 구하는 예. “` public class SquareTest { public static void main(String[] args) { /* 1. 객체 생성 */ Square s = new Square(); /* 2. 필드 초기화(값 변경) */ s.length = 4; /* 3. 결과 출력 */ System.out.printf(“한 변의 길이가 %d인 정사각형의 넓이: %d”, s.length, s.area()); } } /* 4. 정사각형 클래스 구현 */ class Square { int length; // 길이 // 넓이 반환 int area() { return length * length; } } “` ## 10 생성자 — ### 이론 요약 ![클라우드스터딩-자바-생성자-요약](https://i.imgur.com/pMmmkPn.png) #### 생성자 – 생성자는 객체를 만드는 특별한 메소드다. – 생성자는 역할은, 객체 생성과 필드 초기화이다. #### 생성자 특징 – 생성자는, 호출과 정의로 나뉜다. – 생성자명은, 클래스명과 같아야 한다. – 리턴 타입은 표기하지 않는다. (void 아님) ### 실습 리뷰 마린과 메딕 객체의 상호 작용 “` public class Starcraft { public static void main(String[] args) { // 객체 생성 Marine marine = new Marine(“마린”, 80); Medic medic = new Medic(“메딕”, 60); // 마린 스팀팩 버프~ marine.stimpack(); // 메딕의 치료 -> 마린 medic.heal(marine); } } // 마린 클래스 class Marine { // 필드 String name; int hp; // 생성자 public Marine(String name, int hp) { this.name = name; this.hp = hp; } // 메소드 public void stimpack() { System.out.printf(“[%s]의 스팀팩! HP: %d -> “, name, hp); hp -= 10; System.out.printf(“%d “,hp); } } // 메딕 클래스 class Medic { // 필드 String name; int hp; // 생성자 public Medic(String name, int hp) { this.name = name; this.hp = hp; } // 메소드 public void heal(Marine target) { System.out.printf(“[%s]의 치유! %s HP(%d -> “, name, target.name, target.hp); target.hp += 10; System.out.printf(“%d) “, target.hp); } } “` ## 11 레퍼런스 변수와 static — ### 이론 요약 ![클라우드스터딩-자바-레퍼런스와-static-요약](https://i.imgur.com/8SjXUXO.png) #### 레퍼런스 변수 – 레퍼런스 변수란, 객체를 가리키는 변수다. – 기본형 변수는 값을 직접 저장하나, 레퍼런스 변수는 객체의 위치를 가리킨다. #### static 키워드 – static 키워드는 필드와 메소드에 적용될 수 있다. #### 클래스 변수 – 클래스 변수란, 클래스 영역에 존재한다. – 인스턴스 변수란, 객체 내부에 존재한다. #### 인스턴스 변수 – 클래스 메소드란, 주체 객체가 없이 수행되는 메소드다. – 인스턴스 메소드란, 주체 객체가 실행하는 메소드다. ### 실습 리뷰 두 점 사이의 거리 “` public class PointTest { public static void main(String[] args) { // 객체 생성 Point p1 = new Point(0, 0); Point p2 = new Point(3, 4); // 거리 계산 double dist = Point.distance(p1, p2); // 결과 출력 System.out.printf(“두 점 A%s, B%s 사이의 거리: %.2f”, p1.toStr(), p2.toStr(), dist); } } class Point { int x; int y; Point (int _x, int _y) { x = _x; y = _y; } String toStr() { return String.format(“(%d, %d)”, x, y); } static double distance(Point p, Point q) { double dX = p.x – q.x; // x좌표의 변화량 double dY = p.y – q.y; // y좌표의 변화량 return Math.sqrt((dX * dX) + (dY * dY)); } } “` ## 확인하기 — ## 도서구매

[자바의정석] 객체지향 연습문제 6-1, 6-2

학원에서 JAVA 진도를 나가기 시작했다. 객체지향 이전 연산자,배열등은 어느정도 이해했으니 어려운 객체지향 문제들을 풀어보면서 계속 이해해보려 한다. 1번 문제 정답 class SutdaCard { int num ; boolean isKwang ; } 이런건 뭐 easy- 하다 2번 문제 정답 메인 메서드 package practice ; public class oop6_1 { public static void main ( String [ ] args ) { SutdaCard card1 = new SutdaCard ( 3 , false ) ; SutdaCard card2 = new SutdaCard ( ) ; System . out . println ( card1 . info ( ) ) ; System . out . println ( card2 . info ( ) ) ; } } 클래스 class SutdaCard { int num ; boolean isKwang ; SutdaCard ( ) { this ( 1 , true ) ; } SutdaCard ( int num , boolean isKwang ) { this . num = num ; this . isKwang = isKwang ; } String info ( ) { return num + ( isKwang ? “K” : ” ” ) ; } } 정답 해설은 아래의 그림을 보며 이해해보자 8번라인에는 내가 원하는 값들을 9번라인에선 기본 세팅된 값을 설정해주었다. 8번라인에서 설정해준 값은 23번에 생성한 파라미터 값에 각각 대입되어 SutdaCard 클래스 속성에 입력된다. 9번 라인에서는 설정해준 값이 없기 때문에 기본생성자에 세팅해준 기본 값으로 설정이 된다. 그리고 실제 출력시키는 11,12번 라인을 보면 info()메서드를 거쳐 출력이 된다. String info ( ) { return num + ( isKwang ? “K” : ” ” ) ; } 처음에는 void개념을 까먹어서 무작정 void info() 를 썼는데 다시 검색해보니 void는 return값이 필요 없을때 사용을 하지만, 위 메서드는 return 값을 받아야 하기 때문에, void를 쓰지 않고 내가 원하는 타입을 지정해주어야 한다. 근데 난 int와 boolean값을 리턴해야 하는데 int info()를 쓰면 boolean에서 에러가뜨고 boolean info()를 쓰면 int에서 에러가떠서 어떻게 해결해야 할까 하다가 String으로 형변환을 하면 되겠구나 라고 생각했다 (답지 봄) isKwang이 true일 경우 K문자가 붙어서 나오고 false일 경우 K문자가 안붙어 나오도록 삼항 연산자를 사용해서 값을 출력해 냈다. 딩동댕동

연습문제 풀이] Chapter6 객체지향 프로그래밍1

[6-1] 다음과 같은 멤버변수를 갖는 SutdaCard클래스를 정의하시오. 카드의 숫자. (1~10사이의 정수) 답: [6-2] 문제 6-1에서 정의한 SutdaCard클래스에 두 개의 생성자와 info()를 추가해서 실행결과와 같은 결과를 얻도록 하시오. 답 : (1) int num; boolean isKwang; public SutdaCard(){ this(1, true); //SutdaCard(1,true)를 호출한다. } public SutdaCard(int num, boolean isKwang){ this.num = num; this.isKwang = isKwang; } public String info(){ return num + (isKwang ? “K” : “”); } [6-3] 다음과 같은 멤버변수를 갖는 Sutdent클래스를 정의하시오. 타입 변수명 설명 String name 학생이름 int ban 반 int no 번호 int kor 국어점수 int eng 영어점수 int math 수학점수 답: public class Exercise6_3 { String name; int ban; int no; int kor; int eng; int math; } [6-4] 문제 6-3에서 정의한 Student클래스에 다음과 같이 정의된 두 개의 메서드 getTotal()과 getAverage()를 추가하시오. 1. 메서드명 : getTotal 기능 : 국어(kor), 영어(eng), 수학(math)의 점수를 모두 더해서 반환한다. 반환타입 : int 매개변수 : 없음 2. 메서드명 : getAverage 기능 : 총점(국어점수+영어점수+수학점수)을 과목수로 나눈 평균을 구한다. 소수점 둘째자리에서 반올림할 것. 반환타입 : float 매개변수 : 없음 class Exercise6_4 { public static void main(String args[]) { Student s = new Student(); s.name = “홍길동”; s.ban = 1; s.no = 1; s.kor = 100; s.eng = 60; s.math = 76; System.out.println(“이름 :”+s.name); System.out.println(“총점 :”+s.getTotal()); System.out.println(“평균 :”+s.getAverage()); } } class Student { /* (1) 알맞은 코드를 넣어 완성하시오. */ } [실행결과] 이름 : 홍길동 총점 : 236 평균 : 78.7 답 : (1) String name; int ban; int no; int kor; int eng; int math; public int getTotal() { return kor + eng + math; } public float getAverage(){ return Math.round(getTotal() / 3f * 100)/100f; } [6-5] 다음과 같은 실행결과를 얻도록 Student클래스에 생성자와 info()를 추가하시오. class Exercise6_5 { public static void main(String args[]) { Student s = new Student(“홍길동”,1,1,100,60,76); System.out.println(s.info()); } } class Student { /* 알맞은 코드를 넣어 완성하시오 (1) . */ } [실행결과] 홍길동,1,1,100,60,76,236,78.8 답 : public Student(String name, int ban, int no, int kor, int eng, int math) { super(); this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; } public String info() { return name + “,” + ban + “,” + no + “,” + kor + “,” + eng + “,” + math+ “,” + getTotal() + “,” + getAverage(); } [6-6] 두 점의 거리를 계산하는 getDistance()를 완성하시오. ([Hint] 제곱근 계산은 Math.sqrt(double a)를 사용하면 된다.) class Exercise6_6 { // 두 점 (x,y)와 (x1,y1)간의 거리를 구한다. static double getDistance(int x, int y, int x1, int y1) { /* (1)알맞은 코드를 넣어 완성하시오 . */ } public static void main(String args[]) { System.out.println(getDistance(1, 1, 2, 2)); } } [실행결과] 1.4142135623730951 답 : (1) return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); [6-7] 문제6-6에서 작성한 클래스메서드 getDistance()를 MyPoint클래스의 인스턴스메서드로 정의하시오. class MyPoint { int x; int y; MyPoint(int x, int y) { this.x = x; this.y = y; } /* * (1) 인스턴스메서드 getDistance를 작성하시오. */ } class Exercise6_7 { public static void main(String args[]) { MyPoint p = new MyPoint(1, 1); // p와 (2,2)의 거리를 구한다. System.out.println(p.getDistance(2, 2)); } } [실행결과] 1.4142135623730951 답 : (1) public double getDistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); } static 메서드 vs. 인스턴스 메서드 (6-6문제) static 메서드의 경우에는 메서드 내에서 인스턴스 변수를 사용하지 않았다. 대신 매개변수(지역변수)로 작업에 필요한 값을 제공받아야했다. 그래서, 인스턴스와 관계가 없으므로(인스턴스변수를 사용하지 않았으니까) static메서드로 선언할 수 있는 것이다. (6-7문제) 그러나, 인스턴스 메서드는 인스턴스 변수 x, y를 사용해서 작업하므로 매개변수로 x1과 y1만을 제공받으면 된다. 인스턴스와 관계가 있으므로(인스턴스 변수를 사용했으니까) static을 붙일 수 없다. [6-8] 다음의 코드에 정의된 변수들을 종류별로 구분해서 적으시오. class PlayingCard { int kind; int num; static int width; static int height; PlayingCard(int k, int n) { kind = k; num = n; } public static void main(String args[]) { PlayingCard card = new PlayingCard(1,1); } } 답: – 클래스변수 (static변수) : width, height – 인스턴스변수 : kind, num – 지역변수 : k, n, card, args 변수가 선언된 위치를 보면 변수의 종류를 알 수 있다. 클래스 블럭 내에 선언된 변수는 인스턴스 변수이고, static이 붙은 것은 static변수(클래스 변수)이다. 그리고 나머지는 모두 지역변수이다. [6-9] 다음은 컴퓨터 게임의 병사(marine)를 클래스로 정의한 것이다. 이 클래스의 멤버 중에 static을 붙여야 하는 것은 어떤 것들이고 그 이유는 무엇인가? (단, 모든 병사의 공격력과 방어력은 같아야 한다.) class Marine { int x=0, y=0; //Marine의 위치좌표 (x,y) int hp = 60; //현재 체력 int weapon = 6; //공격력 int armor = 0; //방어력 void weaponUp() { weapon++; } void armorUp() { armor++; } void move(int x, int y) { this.x = x; this.y = y; } } 답 : weapon, armor ; 모든 병사의 공격력과 방어력이 같아야 하기 때문에 공유가 가능하도록 static을 붙여야 한다. + weaponUp(), armorUp() – static변수에 대한 작업을 하는 메서드이므로 [6-10] 다음 중 생성자에 대한 설명으로 옳지 않은 것은? (모두 고르시오) a. 모든 생성자의 이름은 클래스의 이름과 동일해야한다. b. 생성자는 객체를 생성하기 위한 것이다. → 생성자가 객체를 생성할 때 사용되기는 하지만, 객체를 초기화할 목적으로 사용되는 것이다. 객체를 생성하는 것은 new연산자이다. c. 클래스에는 생성자가 반드시 하나 이상 있어야 한다. d. 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다. e. 생성자는 오버로딩 할 수 없다. 답: b, e [6-11] 다음 중 this에 대한 설명으로 맞지 않은 것은? (모두 고르시오) a. 객체 자신을 가리키는 참조변수이다. b. 클래스 내에서라면 어디서든 사용할 수 있다. → 인스턴스메서드에서만 사용가능. 클래스 멤버(static이 붙은 변수나 메서드)에는 사용할 수 없다. c. 지역변수와 인스턴스변수를 구별할 때 사용한다. d. 클래스 메서드 내에서는 사용할 수 없다. 답: b [6-12] 다음 중 오버로딩이 성립하기 위한 조건이 아닌 것은? (모두 고르시오) a. 메서드의 이름이 같아야 한다. b. 매개변수의 개수나 타입이 달라야 한다. c. 리턴타입이 달라야 한다. → 리턴타입은 오버로딩에 영향을 주지 못한다. d. 매개변수의 이름이 달라야 한다. 답: c, d 오버로딩의 조건 1. 메서드 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입이 달라야 한다. 3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다. [6-13] 다음 중 아래의 add메서드를 올바르게 오버로딩 한 것은? (모두 고르시오) long add(int a, int b) { return a+b; } a. long add(int x, int y) { return x+y; } b. long add(long a, long b) { return a+b; } c. int add(byte a, byte b) { return a+b; } d. int add(long a, int b) { return (int)(a+b); } 답: b, c, d [6-14] 다음 중 초기화에 대한 설명으로 옳지 않은 것은? (모두 고르시오) a. 멤버변수는 자동 초기화되므로 초기화하지 않고도 값을 참고할 수 있다. b. 지역변수는 사용하기 전에 반드시 초기화해야 한다. c. 초기화 블럭보다 생성자가 먼저 수행된다. → 초기화 블럭이 먼저 수행된다. d. 명시적 초기화를 제일 우선적으로 고려해야 한다. e. 클래스변수보다 인스턴스변수가 먼저 초기화된다. → 클래스변수가 먼저 초기화된다. 답 : c, e 클래스 변수는 클래스가 처음 메모리에 로딩될 때, 자동 초기화되므로 인스턴스 변수보다 먼저 초기화된다. 그리고 생성자는 초기화 블럭이 수행된 다음에 수행된다. [6-15] 다음 중 인스턴스변수의 초기화 순서가 올바른 것은? a. 기본값-명시적초기화-초기화블럭-생성자 b. 기본값-명시적초기화-생성자-초기화블럭 c. 기본값-초기화블럭-명시적초기화-생성자 d. 기본값-초기화블럭-생성자-명시적초기화 답 : a 변수의 초기화 순서 클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화된다. 인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다. 클래스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭 인스턴스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자 [6-16] 다음 중 지역변수에 대한 설명으로 옳지 않은 것은? (모두 고르시오) a. 자동 초기화되므로 별도의 초기화가 필요없다. → 지역변수는 자동 초기화 되지 않기 때문에 사용하기 전에 반드시 적절한 값으로 초기화를 해주어야한다. b. 지역변수가 선언된 메서드가 종료되면 지역변수도 함께 소멸된다. c. 메서드의 매개변수로 선언된 변수도 지역변수이다. d. 클래스변수나 인스턴스변수보다 메모리 부담이 적다. → 지역변수는 자신이 선언된 블럭이나 메서드가 종료되면 소멸되므로 메모리 부담이 적다. e. 힙(heap)영역에 생성되며 가비지 컬렉터에 의해 소멸된다. → 힙영역에는 인스턴스(인스턴스변수)가 생성되는 영역이며, 지역변수는 호출스택(call stack)에 생성된다. 답 : a, e [6-17] 호출스택이 다음과 같은 상황일 때 옳지 않은 설명은? (모두 고르시오) a. 제일 먼저 호출스택에 저장된 것은 main메서드이다. b. println메서드를 제외한 나머지 메서드들은 모두 종료된 상태이다. → 호출스택의 제일 위에 있는 메서드가 현재 수행중인 메서드이며, 호출스택 안의 나머지 메서드들은 대기상태이다. c. method2메서드를 호출한 것은 main메서드이다. d. println메서드가 종료되면 method1메서드가 수행을 재개한다. e. main-method2-method1-println의 순서로 호출되었다. f. 현재 실행중인 메서드는 println뿐이다. 답: b [6-18] 다음의 코드를 컴파일하면 에러가 발생한다. 컴파일 에러가 발생하는 라인과 그 이유를 설명하시오. class MemberCall { int iv = 10; static int cv = 20; int iv2 = cv; static int cv2 = iv; // 라인 A static void staticMethod1() { System.out.println(cv); System.out.println(iv); // 라인 B } void instanceMethod1() { System.out.println(cv); System.out.println(iv); //라인 C } static void staticMethod2() { staticMethod1(); instanceMethod1(); //라인 D } void instanceMethod2() { staticMethod1(); //라인 E instanceMethod1(); } } 답 : 라인 A, 라인 B, 라인 D 라인A – static 변수의 초기화에 인스턴스변수를 사용할 수 없다. 꼭 사용해야한다면, 객체를 생성해야한다. 라인B – static메서드에서는 인스턴스변수를 사용할 수 없다. 라인D – static메서드에서는 인스턴스메서드를 사용할 수 없다. [6-19] 다음 코드의 실행 결과를 예측하여 적으시오. class Exercise6_19 { public static void change(String str) { str += “456”; } public static void main(String[] args) { String str = “ABC123”; System.out.println(str); change(str); System.out.println(“After change:” + str); } } 답 : ABC123 After change: ABC123 해설 : str은 change메서드의 지역변수이므로 change메서드가 종료되면 str역시 메모리에서 제거된다. [6-20] 다음과 같이 정의된 메서드를 작성하고 테스트하시오. ([주의] Math.random()을 사용하는 경우 실행결과와 다를 수 있음.) 메서드명 : shuffle 기능 : 주어진 배열에 담긴 값의 위치를 바꾸는 작업을 반복하여 뒤섞이게 한다. 처리한 배열을 반환한다. 반환타입 : int[] 매개변수 : int[] arr – 정수값이 담긴 배열 class Exercise6_20 { /* * (1) shuffle 메서드를 작성하시오. * */ public static void main(String[] args) { int[] original = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; System.out.println(java.util.Arrays.toString(original)); int[] result = shuffle(original); System.out.println(java.util.Arrays.toString(result)); } } 답: public static int[] shuffle(int[] arr) { for (int i = 0; i < arr.length; i++) { int j = (int)Math.random() % arr.length; int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } return arr; } [6-21] Tv클래스를 주어진 로직대로 완성하시오. 완성한 후에 실행해서 주어진 실행결과와 일치하는지 확인하라. ([참고] 코드를 단순히 하기 위해서 유효성검사는 로직에서 제외했다.) class MyTv { boolean isPowerOn; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; void turnOnOff() { // (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다. } void volumeUp() { // (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1 증가시킨다. } void volumeDown() { // (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1 감소시킨다. } void channelUp() { // (4) channel의 값을 1 증가시킨다. // 만일 channel이 MAX_CHANNEL이면 , channel의 MIN_CHANNEL 값을 로 바꾼다. } void channelDown() { // (5) channel의 값을 1 감소시킨다 . // 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX_CHANNEL 로 바꾼다. } } class Exercise6_21 { public static void main(String args[]) { MyTv t = new MyTv(); t.channel = 100; t.volume = 0; System.out.println("CH:" + t.channel + ", VOL:" + t.volume); t.channelDown(); t.volumeDown(); System.out.println("CH:" + t.channel + ", VOL:" + t.volume); t.volume = 100; t.channelUp(); t.volumeUp(); System.out.println("CH:" + t.channel + ", VOL:" + t.volume); } } [실행결과] CH: 100, VOL: 0 CH: 99, VOL: 0 CH: 100, VOL: 100 답 : (1) isPowerOn = !isPowerOn; (2) if(volume < MAX_VOLUME) volume++; (3) if(volume > MIN_VOLUME) volume–; (4) if(channel == MAX_CHANNEL) channel = MIN_CHANNEL; else channel++; (5) if(channel == MIN_CHANNEL) channel = MAX_CHANNEL; else channel–; [6-22] 다음과 같이 정의된 메서드를 작성하고 테스트하시오. 메서드명 : isNumber 기능 : 주어진 문자열이 모두 숫자로만 이루어져있는지 확인한다. 모두 숫자로만 이루어져있으면 true를 반환하고, 그렇지 않으면 false를 반환한다. 만일 주어진 문자열이 null이거나 빈문자열 “”이라면 false를 반환한다. 반환타입 : boolean 매개변수 : String str – 검사할 문자열 ([Hint] String클래스의 charAt(int i)메서드를 사용하면 문자열의 i번째 위치한 문자를 얻을 수 있다.) class Exercise6_22 { /* (1) isNumber 메서드를 작성하시오. */ public static void main(String[] args) { String str = “123”; System.out.println(str + ” 는 숫자입니까? ” + isNumber(str)); str = “1234o”; System.out.println(str + ” 는 숫자입니까? ” + isNumber(str)); } } [실행결과] 123는 숫자입니까? true 1234o는 숫자입니까? false 답 : public static boolean isNumber(String str){ boolean ret = true; for(int i =0;i < str.length(); i++){ if(str.charAt(i)>=’0′ && str.charAt(i)<='9') continue; else { ret = false; break; } } return ret; } [6-23] 다음과 같이 정의된 메서드를 작성하고 테스트하시오. 메서드명 : max 기능 : 주어진 int형 배열의 값 중에서 제일 큰 값을 반환한다. 만일 주어진 배열이 null이거나 크기가 0인 경우, -999999를 반환한다. 반환타입 : int 매개변수 : int[] arr - 최대값을 구할 배열 class Exercise6_23 { /* (1) max 메서드를 작성하시오 . */ public static void main(String[] args) { int[] data = {3,2,9,4,7}; System.out.println(java.util.Arrays.toString(data)); System.out.println("최대값 :"+max(data)); 최대값 System.out.println(" :"+max(null)); System.out.println("최대값 :"+max(new int[]{})); // 크기가 0인 배열 } } } [실행결과] [3, 2, 9, 4, 7] 최대값: 9 최대값: -999999 최대값: -999999 답 : public static int max(int[] arr){ if(arr == null || arr.length == 0){ return -999999; } int maxVal = arr[0]; for(int i = 1; i < arr.length; i++){ maxVal = (maxVal >= arr[i]) ? maxVal : arr[i]; } return maxVal; } [6-24] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

[Java] 부록(1) 객체지향 프로그래밍 연습문제

위 글은 해당 카테고리의 수업 강의 자료(연습문제)를 정리한 것입니다. 손이 가는대로 무지성으로 푼 것도 많아서… 풀었던 문제 정리하면서 객체지향을 이해하는게 나은 것 같아 작성 (연습문제, Pratice03~05 부분) package com.javaex.problem01; public class Member { private String id; private String name; private int point; public Member() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPoint() { return point; } public void setPoint(int point) { this.point = point; } public Member(String id, String name, int point) { super(); this.id = id; this.name = name; this.point = point; } public void Draw() { System.out.println(id+ ” “+name+” “+point); } @Override public String toString() { return “Member [id=” + id + “, name=” + name + “, point=” + point + “]”; } } public class MemberApp { public static void main(String[] args) { // TODO Auto-generated method stub Member m = new Member(“20172829”, “지현정”, 20172829); m.Draw(); // m.toString(); XXXX // toString은 문자열만 반환하므로 System.out.println(변수명.toString()) System.out.println(m.toString()); } } public class Base { public void service(String state) { if(state.equals(“낮”)) day(); else if(state.equals(“오후”)) afternoon(); else night(); } public void day() { System.out.println(“낮에도 일해”); } public void night() { System.out.println(“밤에도 일해”); } public void afternoon() { System.out.println(“오후에도 일해”); } } public class BaseApp { public static void main(String[] args) { // TODO Auto-generated method stub Base b = new Base(); b.service(“낮”); b.service(“밤”); b.service(“오후”); } } public class Print { public void print(boolean bool) { System.out.println(bool); } public void print(String str) { System.out.println(str); } public void print(int num) { System.out.println(num); } public void print(double number) { System.out.println(number); } } public class PrintApp { public static void main(String[] args) { // TODO Auto-generated method stub Print print = new Print(); print.print(10); print.print(true); print.print(5.7); print.print(“홍길동”); } public class CConverter { public static double rate; public static void setRate(double r){ CConverter.rate = r; } public static double toDoller(double won){ return won / rate; } public static double toKRW(double dollar){ return dollar * rate; } } public class CConverterApp { public static void main(String[] args) { double dollar = 1000000; double won = 100; CConverter.setRate(1229.40); System.out.println(“백만원은 ” + CConverter.toDoller(dollar) + ” 달러입니다.”); System.out.println(“백달러는”+ CConverter.toKRW(won) + “원입니다.”); } } public class StringUtil { private static String str=””; public static String concatString(String[] strArray) { for(int i=0; i array로 넘어감… 명시 String[] arr1 = str1.split(” “); String[] arr2 = str2.split(” “); String[] arr3 = str3.split(” “); // Friend 객체 생성하여 데이터 넣기 -> 생성자 호출 -> 객체 생성 Friend f1 = new Friend(arr1[0], arr1[1], arr1[2]); Friend f2 = new Friend(arr2[0], arr2[1], arr2[2]); Friend f3 = new Friend(arr3[0], arr3[1], arr3[2]); // 배열에 추가하기 ( friendArray “); int menuNo = sc.nextInt(); switch(menuNo){ case 1: System.out.print(“예금액>”); money = sc.nextInt(); account.deposit(money); break; case 2: System.out.print(“출금액>”); money= sc.nextInt(); account.withdraw(money); break; case 3: System.out.print(“잔고액>”); account.showBalance(); break; case 4: System.out.print(“프로그램 종료”); run = false; break; default : System.out.println(“다시입력해주세요”); break; }//switch }//while sc.close(); } } public class Book { private int bookNo; private String title; private String author; private int stateCode; public Book(int bookNo, String title, String author) { // TODO Auto-generated constructor stub this.bookNo = bookNo; this.title = title; this.author = author; stateCode = 1; // this.stateCode = stateCode; } public void rent() { stateCode = 0; } public void print() { if(stateCode == 0) System.out.println(bookNo+” 책 제목: “+ title+” 저자: “+ author+ ” 대여 유무: 대여 중”); else System.out.println(bookNo+” 책 제목: “+ title+”, 저자: “+ author+ “, 대여 유무: 재고 있음”); } } import java.util.Scanner; public class BookShop { public static void main(String[] args) { Book[] books = new Book[10]; books[0] = new Book(1, “트와일라잇”, “스테파니메이어”); books[1] = new Book(2, “뉴문”, “스테파니메이어”); books[2] = new Book(3, “이클립스”, “스테파니메이어”); books[3] = new Book(4, “브레이킹던”, “스테파니메이어”); books[4] = new Book(5, “아리랑”, “조정래”); books[5] = new Book(6, “젊은그들”, “김동인”); books[6] = new Book(7, “아프니깐 청춘이다”, “김난도”); books[7] = new Book(8, “귀천”, “천상병”); books[8] = new Book(9, “태백산맥”, “조정래”); books[9] = new Book(10, “풀하우스”, “원수연”); System.out.println(“*****도서 정보 출력하기******”); displayBookInfo(books); Scanner scanner = new Scanner(System.in); System.out.print(“대여 하고 싶은 책의 번호를 입력하세요:”); int num = scanner.nextInt(); scanner.close(); // (1) 입력된 번호에 맞는 책을 찾아 대여 되었음(상태코드=0)을 체크 합니다. books[num-1].rent(); System.out.println(“*****도서 정보 출력하기******”); displayBookInfo(books); } //(2)전달받은 배열을 모두 출력하는 메소드 private static void displayBookInfo(Book[] books) { //코드작성 for(int i=0; i > “); Scanner sc = new Scanner(System.in); int a=0; String sign = “”; int b=0; try { a = sc.nextInt(); sign = sc.next(); b = sc.nextInt(); } catch(InputMismatchException e) { System.out.println(“종료합니다..”); break; } switch(sign) { case “+”: Add add = new Add(); add.setValue(a,b); System.out.println(“>> “+add.calculate()); break; case “-“: Sub sub = new Sub(); sub.setValue(a, b); System.out.println(“>> “+sub.calculate()); break; case “*”: Mul mul = new Mul(); mul.setValue(a,b); System.out.println(“>> “+mul.calculate()); break; case “/”: Div div = new Div(); div.setValue(a,b); System.out.println(“>> “+div.calculate()); break; default: System.out.println(“알 수 없는 연산입니다.”); break; } } } }

coderbear’s log

728×90 # Chapter 6 : 객체지향 프로그래밍 1 Q1. 다음과 같은 멤버변수를 갖는 SutdaCard클래스를 정의하시오. 타입 변수명 설명 int num 카드의 숫자 (1~10 사이의 정수) boolean isKwang 광(光)이면 true 아니면 false A. class SutdaCard { int num; boolean isKwang; } Q2. 문제 Q1에서 정의한 SutdaCard클래스에 두 개의 생성자와 info()를 추가해서 실행결과와 같은 결과를 얻도록 하시오. class Exercise6_2 { public static void main(String args[]) { SutdaCard card1 = new SutdaCard(3, false); SutdaCard card2 = new SutdaCard(); System.out.println(card1.info()); System.out.println(card2.info()); } } class SutdaCard { /* (1) 알맞은 코드를 넣어 완성하시오. */ } [ 실행결과 ] 31 K A. public class Snippet { boolean isKwang; SutdaCard() { this(1, true); // SutdaCard(1, true)를 호출한다. } SutdaCard(int num, boolean isKwang) { this.num = num; this.isKwang = isKwang; } String info() { // 숫자를 문자열로 반환한다. 광(光)인 경우 K를 덧붙인다. return num + ( isKwang? “K” : “”); } } 객체를 생성할 때 두 개의 생성자를 사용했으므로 두 개의 생성자를 정의해야한다. SutdaCard card1 = new SutdaCard(3, false); // 3 SutdaCard card2 = new SutdaCard(); // 1K 일단 매개변수가 있는 생성자를 살펴보면, 카드의 num과 isKwang의 값을 매개변수로 받는 것을 알 수 있다. 그리고 매개변수가 없는 기본 생성자는 실행결과에서 “1K”가 출력된 것으로 봐서 num과 isKwang의 값을 각각 1과 true로 하였다는 것을 알 수 있다. 매개변수가 없는 기본 생성자를 정의할 때, 왼쪽의 코드와 같이 할 수도 있지만 오른쪽 코드와 같이 기존의 코드를 호출하는 것이 더 좋은 코드이다. 재사용성이 더 높고 나중에 코드를 수정할 때도 유리하다. info()메서드는 card인스턴스의 정보를 문자열로 반환하기 위한 것이다. card인스턴스의 멤버변수 num와 isKwang의 값을 문자열로 만들어서 반환하면 된다. isKwang의 값이 true인 경우에는 숫자 뒤에 “K”를 붙이도록 삼항연산자를 사용했다. String info() { // 숫자를 문자열로 반환한다. 광(光)인 경우 K를 덧붙인다. return num + ( isKwang? “K” : “”); } 변수 num은 타입이 int이지만 문자열과 덧셈연산을 하기 때문에 최종적으로는 문자열을 반환하게 된다. Q3. 다음과 같은 멤버변수를 갖는 Student클래스를 정의하시오. 타입 변수명 설명 String name 학생이름 int ban 반 int no 번호 int kor 국어점수 int eng 영어점수 int math 수학점수 A. class Student { String name; int ban; int no; int kor; int eng; int math; } Q4. 문제6-3에서 정의한 Student클래스에 다음과 같이 정의된 두 개의 메서드 getTotal()과 getAverage()를 추가하시오. ① 메서드명 : getTotal 기 능 : 국어(kor), 영어(eng), 수학(math)의 점수를 모두 더해서 반환한다. 반환타입 : int 매개변수 : 없음 ② 메서드명 : getAverage 기 능 : 총점(국어점수+영어점수+수학점수)을 과목수로 나눈 평균을 구한다. 소수점 둘째자리에서 반올림할 것. 반환타입 : float 매개변수 : 없음 class Exercise6_4 { public static void main(String args[]) { Student s = new Student(); s.name = “홍길동”; s.ban = 1; s.no = 1; s.kor = 100; s.eng = 60; s.math = 76; System.out.println(“이름:”+s.name); System.out.println(“총점:”+s.getTotal()); System.out.println(“평균:”+s.getAverage()); } } class Student { /* (1) 알맞은 코드를 넣어 완성하시오. */ } [ 실행결과 ] 이름:홍길동 총점:236 평균:78.7 A. class Student { String name; int ban; int no; int kor; int eng; int math; int getTotal() { return kor + eng + math; } float getAverage() { return (int)(getTotal() / 3f * 10 + 0.5f) / 10f; } } } 총점과 평균을 구하는 문제인데, 평균을 구할 때 소수점 둘째 자리에서 반올림을 하는 부분에서 생각을 좀 해야 할 것이다. 총점의 타입이 int이기 때문에 3으로 나누면 int와 int간의 연산이므로 결과를 int로 얻는다. 즉, 소수점 이하의 값은 버려지게 된다. 그래서 float타입의 리터럴인 3f로 나누어야 소수점 이하의 값들을 얻을 수 있다. 그리고, 소수점 둘째 자리에서 반올림하려면 10을 곱하고 0.5를 더한 다음 다시 10f로 나누면 된다. 236 / 3 → 78 236 / 3f → 78.666664 236 / 3f * 10 → 786.66664 236 / 3f * 10 + 0.5 → 787.16664 (int)(236 / 3f * 10 + 0.5) → (int)787.16664 → 787 (int)(236 / 3f * 10 + 0.5) / 10 → 78 (int)(236 / 3f * 10 + 0.5) / 10f → 78.7 Q5. 다음과 같은 실행결과를 얻도록 Student클래스에 생성자와 info()를 추가하시오. class Exercise6_5 { public static void main(String args[]) { Student s = new Student(“홍길동”,1,1,100,60,76); System.out.println(s.info()); } } class Student { /* (1) 알맞은 코드를 넣어 완성하시오. */ } [ 실행결과 ] 홍길동,1,1,100,60,76,236,78.7 A. String name; int ban; int no; int kor; int eng; int math; Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; } int getTotal() { return kor+eng+math; } float getAverage() { return (int)(getTotal() / 3f * 10 + 0.5f) / 10f; } public String info() { return name +”,”+ban +”,”+no +”,”+kor +”,”+eng +”,”+math +”,”+getTotal() +”,”+getAverage() ; } 학생의 이름, 반, 번호, 과목별 성적을 매개변수로 받는 생성자를 추가하고, 학생의 정보를 출력하는 info()메서드를 정의하는 문제이다. Q6. 두 점의 거리를 계산하는 getDistance()를 완성하시오. [Hint] 제곱근 계산은 Math.sqrt(double a)를 사용하면 된다. class Exercise6_6 { // 두 점 (x,y)와 (x1,y1)간의 거리를 구한다. static double getDistance(int x, int y, int x1, int y1) { /* (1) 알맞은 코드를 넣어 완성하시오. */ } public static void main(String args[]) { System.out.println(getDistance(1,1,2,2)); } } [ 실행결과 ] 1.4142135623730951 A. return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); 두 점 (x, y)와 (x1, y1)의 거리를 구하는 공식은 아래와 같다. 제곱근 계산은 Math클래스의 sqrt(double a)를 사용하면 된다. 제곱도 Math.pow(double a, double b)를 사용하면 되지만, 2제곱이므로 그냥 곱셈연산자를 사용했다. 어느 쪽을 사용해도 괜찮지만, 메서드를 호출하는 것은 곱셈연산보다 비용이 많이 드는 작업이라는 것은 기억해두자. 그렇다고 해서 보다 빠른 코드를 만들겠다고 코드를 복잡하게 하는 것은 좋지 않다. 참고로 Math.pow(double a, double b)를 사용한 코드는 다음과 같다. static double getDistance(int x, int y, int x1, int y1) { return Math.sqrt(Math.pow(x-x1,2) + Math.pow(y-y1,2)); } Q7. 문제6-6에서 작성한 클래스메서드 getDistance()를 MyPoint클래스의 인스턴스 메서드로 정의하시오. class MyPoint { int x; int y; MyPoint(int x, int y) { this.x = x; this.y = y; } /* (1) 인스턴스메서드 getDistance를 작성하시오. */ } class Exercise6_7 { public static void main(String args[]) { MyPoint p = new MyPoint(1,1); // p와 (2,2)의 거리를 구한다. System.out.println(p.getDistance(2,2)); } } [ 실행결과 ] 1.4142135623730951 A. double getDistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); } 이전 문제의 static메서드를 인스턴스 메서드로 변경하는 문제인데, static메서드와 인스턴스 메서드의 차이를 이해하는 것은 매우 중요하다. static메서드인 경우에는 메서드 내에서 인스턴스 변수를 사용하지 않았다. 대신 매개변수(지역변수)로 작업에 필요한 값을 제공받아야했다. 그래서, 인스턴스와 관계가 없으므로(인스턴스변수를 사용 안했으니까) static메서드로 선언할 수 있는 것이다. static double getDistance(int x, int y, int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); // x, y는 지역변수 } 그러나, 인스턴스 메서드는 인스턴스 변수 x, y를 사용해서 작업하므로 매개변수로 x1과 y1만을 제공받으면 된다. 인스턴스와 관계가 있으므로(인스턴스 변수를 사용했으니까) static을 붙일 수 없다. double getDistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));// x, y는 인스턴스 변수 } 아래의 코드는 인스턴스 메서드를 사용할 때와 static메서드를 사용할 때의 차이를 보여주기 위한 것이다. 어떤 차이가 있는지 잘 살펴보자. ① static메서드의 사용 System.out.println(Exercise6_6.getDistance(1,1,2,2)); ② 인스턴스 메서드의 사용 MyPoint p = new MyPoint(1,1); System.out.println(p.getDistance(2,2)); MyPoint클래스에 두 점간의 거리를 계산하는 메서드 getDistance()를 넣는다면, static메서드 보다는 인스턴스메서드로 정의하는 것이 더 적합하다. Q8. 다음의 코드에 정의된 변수들을 종류별로 구분해서 적으시오. class PlayingCard { int kind; int num; static int width; static int height; PlayingCard(int k, int n) { kind = k; num = n; } public static void main(String args[]) { PlayingCard card = new PlayingCard(1,1); } } A. – 클래스변수(static변수) : width, height – 인스턴스변수 : kind, num – 지역변수 : k, n, card, args 변수가 선언된 위치를 보면 변수의 종류를 알 수 있다. 클래스 블럭{}내에 선언된 변수는 인스턴스 변수이고, static이 붙은 것은 static변수(클래스 변수)이다. 그리고 나머지는 모두 지역변수이다. Q9. 다음은 컴퓨터 게임의 병사(marine)를 클래스로 정의한 것이다. 이 클래스의 멤버 중에 static을 붙여야 하는 것은 어떤 것들이고 그 이유는 무엇인가? (단, 모든 병사의 공격력과 방어력은 같아야 한다.) class Marine { int x=0, y=0; // Marine의 위치좌표(x,y) int hp = 60; // 현재 체력 int weapon = 6; // 공격력 int armor = 0; // 방어력 void weaponUp() { weapon++; } void armorUp() { armor++; } void move(int x, int y) { this.x = x; this.y = y; } } A. weapon, armor – 모든 Marine인스턴스에 대해 동일한 값이어야 하므로 weaponUp(), armorUp() – static변수에 대한 작업을 하는 메서드이므로 인스턴스마다 개별적인 값을 가져야하는 변수는 인스턴스변수로, 모든 인스턴스가 공통적인 값을 가져야하는 변수는 클래스 변수(static변수)로 선언해야한다. 그래서 위의 코드에서 어떤 변수들이 모든 인스턴스에서 공통적인 적인 값을 가져야하는지 알아내야한다. 병사(marin)의 위치는 모든 병사가 서로 다른 위치에 있어야 하므로 개별적인 값이어야 하고, 병사들마다 부상의 정도가 다를 것이므로 병사들의 체력(hp) 역시 개별적인 값이어야 한다. 그러나 모든 병사들의 공격력과 방어력은 같아야 한다.(게임이니까) 그래서 공격력을 의미하는 변수 weapon과 방어력을 의미하는 변수 armor에 static을 붙어야한다. 그 다음은 메서드인데, 어떤 메서드에 static을 붙이고 어떤 메서드에는 static을 붙이지 않아야하는 것일까? 메서드는 어떠한 작업을 하는 것인데, 이 작업을 할 때 인스턴스변수를 사용하면 인스턴스 메서드로 하고, 그렇지 않으면 static메서드로 하면 된다. 보통 인스턴스메서드는 인스턴스변수와 관련된 작업을 하고, static메서드는 static변수와 관련된 작업을 하기 때문이다. 메서드 weaponUp()과 armorUp()은 각각 static변수 weapon과 armor를 가지고 작업을 하기 때문에 static을 붙이는 것이 맞다. 반면에 메서드 move(int x, int y)는 인스턴스변수 x와 y를 가지고 작업하기 때문에 static을 붙여서는 안 된다. Q10. 다음 중 생성자에 대한 설명으로 옳지 않은 것은? (모두 고르시오.) ① 모든 생성자의 이름은 클래스의 이름과 동일해야한다. ② 생성자는 객체를 생성하기 위한 것이다. ③ 클래스에는 생성자가 반드시 하나 이상 있어야 한다. ④ 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다. ⑤ 생성자는 오버로딩 할 수 없다. A. ② 생성자는 객체를 생성하기 위한 것이다. 생성자가 객체를 생성할 때 사용되기는 하지만, 객체를 초기화할 목적으로 사용되는 것이다. 객체를 생성하는 것은 new연산자이다. ⑤ 생성자는 오버로딩 할 수 없다. 생성자도 오버로딩이 가능해서 하나의 클래스에 여러 개의 생성자를 정의할 수 있다. Q11. 다음 중 this에 대한 설명으로 맞지 않은 것은? (모두 고르시오.) ① 객체 자신을 가리키는 참조변수이다. ② 클래스 내에서라면 어디서든 사용할 수 있다. ③ 지역변수와 인스턴스변수를 구별할 때 사용한다. ④ 클래스 메서드 내에서는 사용할 수 없다. A. ② 클래스 내에서라면 어디서든 사용할 수 있다. 클래스 멤버(static이 붙은 변수나 메서드)에는 사용할 수 없다. this는 인스턴스 자신의 주소를 저장하고 있으며, 모든 인스턴스메서드에 숨겨진 채로 존재하는 지역변수이다. 그래서 인스턴스메서드 내에서만 사용할 수 있다. Q12. 다음 중 오버로딩이 성립하기 위한 조건이 아닌 것은? (모두 고르시오.) ① 메서드의 이름이 같아야 한다. ② 매개변수의 개수나 타입이 달라야 한다. ③ 리턴타입이 달라야 한다. ④ 매개변수의 이름이 달라야 한다. A. ③ 리턴타입이 달라야 한다. 리턴타입은 오버로딩에 영향을 주지 못한다. ④ 매개변수의 이름이 달라야 한다. 리턴타입은 오버로딩에 영향을 주지 못한다. 오버로딩의 조건 1. 메서드 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입이 달라야 한다. 3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다. (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.) Q13. 다음 중 아래의 add메서드를 올바르게 오버로딩 한 것은? (모두 고르시오.) long add(int a, int b) { return a+b;} ① long add(int x, int y) { return x+y;} ② long add(long a, long b) { return a+b;} ③ int add(byte a, byte b) { return a+b;} ④ int add(long a, int b) { return (int)(a+b);} A. ②, ③, ④ ②, ③, ④는 모두 메서드의 이름이 add이고 매개변수의 타입이 다르므로 오버로딩이 성립한다. 오버로딩이 성립하기 위한 조건은 위에서 언급한 것을 확인하자. Q14. 다음 중 초기화에 대한 설명으로 옳지 않은 것은? (모두 고르시오.) ① 멤버변수는 자동 초기화되므로 초기화하지 않고도 값을 참조할 수 있다. ② 지역변수는 사용하기 전에 반드시 초기화해야 한다. ③ 초기화 블럭보다 생성자가 먼저 수행된다. ④ 명시적 초기화를 제일 우선적으로 고려해야 한다. ⑤ 클래스변수보다 인스턴스변수가 먼저 초기화된다. A. ③, ⑤ 클래스변수는 클래스가 처음 메모리에 로딩될 때, 자동 초기화되므로 인스턴스 변수보다 먼저 초기화 된다. 그리고 생성자는 초기화 블럭이 수행된 다음에 수행된다. Q15. 다음 중 인스턴스변수의 초기화 순서가 올바른 것은? ① 기본값-명시적초기화-초기화블럭-생성자 ② 기본값-명시적초기화-생성자-초기화블럭 ③ 기본값-초기화블럭-명시적초기화-생성자 ④ 기본값-초기화블럭-생성자-명시적초기화 A. ① 변수의 초기화 순서는 다음과 같다. 변수의 초기화 순서 클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다. 인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다. 클래스변수의 초기화순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭 인스턴스변수의 초기화순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자 Q16. 다음 중 지역변수에 대한 설명으로 옳지 않은 것은? (모두 고르시오.) ① 자동 초기화되므로 별도의 초기화가 필요없다. ② 지역변수가 선언된 메서드가 종료되면 지역변수도 함께 소멸된다. ③ 매서드의 매개변수로 선언된 변수도 지역변수이다. ④ 클래스변수나 인스턴스변수보다 메모리 부담이 적다. ⑤ 힙(heap)영역에 생성되며 가비지 컬렉터에 의해 소멸된다. A. ①, ⑤ 지역변수는 자동 초기화 되지 않기 때문에 사용하기 전에 반드시 적절한 값으로 초기화를 해주어야한다. 지역변수는 자신이 선언된 블럭이나 메서드가 종료되면 소멸되므로 메모리 부담이 적다. 힙(heap)영역에는 인스턴스(인스턴스변수)가 생성되는 영역이며, 지역변수는 호출스택(call stack)에 생성된다. Q17. 호출스택이 다음과 같은 상황일 때 옳지 않은 설명은? (모두 고르시오.) ① 제일 먼저 호출스택에 저장된 것은 main메서드이다. ② println메서드를 제외한 나머지 메서드들은 모두 종료된 상태이다. ③ method2메서드를 호출한 것은 main메서드이다. ④ println메서드가 종료되면 method1메서드가 수행을 재개한다. ⑤ main-method2-method1-println의 순서로 호출되었다. ⑥ 현재 실행중인 메서드는 println 뿐이다. A. ② 호출스택의 제일 위에 있는 메서드가 현재 수행중인 메서드이며, 호출스택 안의 나머지 메서드들은 대기상태이다. Q18. 다음의 코드를 컴파일하면 에러가 발생한다. 컴파일 에러가 발생하는 라인과 그 이유를 설명하시오. class MemberCall { int iv = 10; static int cv = 20; int iv2 = cv; static int cv2 = iv; // 라인 A static void staticMethod1() { System.out.println(cv); System.out.println(iv); // 라인 B } void instanceMethod1() { System.out.println(cv); System.out.println(iv); // 라인 C } static void staticMethod2() { staticMethod1(); instanceMethod1(); // 라인 D } void instanceMethod2() { staticMethod1(); // 라인 E instanceMethod1(); } } A. 라인 A, 라인 B, 라인 D 라인 A – static변수의 초기화에 인스턴스변수를 사용할 수 없다. 꼭 사용해야한다면, 객체를 생성해야한다. 라인 B – static메서드에서는 인스턴스변수를 사용할 수 없다. 라인 D – static메서드에서는 인스턴스메서드를 사용할 수 없다. Q19. 다음 코드의 실행 결과를 예측하여 적으시오. class Exercise6_19 { public static void change(String str) { str += “456”; } public static void main(String[] args) { String str = “ABC123”; System.out.println(str); change(str); System.out.println(“After change:”+str); } } A. [ 실행결과 ] ABC123 After change:ABC123 change메서드의 매개변수가 참조형인데도 왜? main메서드의 문자열 str에 변경한 내용이 반영되지 않은 것일까? 많은 사람들이 매개변수가 참조형이라는 것만 보고 main메서드의 문자열 str이 변경될 것이라고 쉽게 생각한다. 누구라도 실수하기 쉬운 부분이므로 주의하길 바라는 마음에서 이 문제를 만들었다. 그림과 함께 단계 별로 설명하면 어렵지 않게 이해할 수 있을 것이다. 처음에 문자열을 참조변수 str에 저장하면 아래와 같은 그림이 된다. String str = “ABC123”; 그 다음에 메서드 change를 호출하면서 참조변수 str을 넘겨주면, 메서드 change의 지역변수 str에 주소값 0x100이 저장된다. 이제 메서드 change의 지역변수 str도 문자열 “ABC123″을 참조하게 된다. 이 두 참조변수는 이름은 같지만 분명히 다른 변수 이다. 서로 다른 영역에 존재하기 때문에 이름이 같아도 상관없는 것이다. change(str); // change를 호출하면서 문자열 str을 넘겨준다. 메서드 change에서는 넘겨받은 문자열의 뒤에 “456”을 붙인다. 문자열은 내용을 변경할 수 없기 때문에 덧셈연산을 하면 새로운 문자열이 생성되고 새로운 문자열의 주소가 변수 str에 저장된다. public static void change(String str) { str += “456”; // 기존의 문자열에 “456”을 붙인다. } 이제 change메서드는 종료되고, 작업에 사용하던 메모리를 반환하므로 change메서드의 지역변수인 str역시 메모리에서 제거된다. 다시 main메서드로 돌아와서 문자열 str의 값을 출력하면 처음의 값과 변함없는 값이 출력된다. 문자열 “ABC123456″은 참조하는 변수가 하나도 없으므로 적절한 시기에 가비지컬렉터(garbage collector)에 의해 제거된다. System.out.println(“After change:”+str); Q20. 다음과 같이 정의된 메서드를 작성하고 테스트하시오. [주의] Math.random()을 사용하는 경우 실행결과와 다를 수 있음. 메서드명 : shuffle 기 능 : 주어진 배열에 담긴 값의 위치를 바꾸는 작업을 반복하여 뒤섞이게 한다. 처리한 배열을 반환한다. 반환타입 : int[] 매개변수 : int[] arr – 정수값이 담긴 배열 class Exercise6_20 { /* (1) shuffle메서드를 작성하시오. */ public static void main(String[] args) { int[] original = {1,2,3,4,5,6,7,8,9}; System.out.println(java.util.Arrays.toString(original)); int[] result = shuffle(original); System.out.println(java.util.Arrays.toString(result)); } } [ 실행결과 ] [1, 2, 3, 4, 5, 6, 7, 8, 9] [4, 6, 8, 3, 2, 9, 7, 1, 5] A. public static int[] shuffle(int[] arr) { if(arr==null || arr.length==0) return arr; for(int i=0; i< arr.length;i++) { int j = (int)(Math.random()*arr.length); // arr[i]와 arr[j]의 값을 서로 바꾼다. int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } return arr; } int배열을 매개변수로 받아서 배열에 저장된 각 요소들의 위치를 여러번 바꿔서 섞은 다음 반환하는 메서드이다. 매개변수로 어떤 값이 넘어올지 모르기 때문에 작업을 시작하기 전에 값의 유효성체크는 반드시 해야 한다. 아래의 코드는 넘겨받은 배열이 null이거나 크기가 0이면 그대로 반환한다. if(arr==null || arr.length==0) return arr; 반복문을 이용해서 반복적으로 배열의 임의의 두 요소의 값을 바꾼다. for(int i=0; i< arr.length;i++) { int j = (int)(Math.random()*arr.length); // arr[i]와 arr[j]의 값을 서로 바꾼다. int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } Math.random()을 사용하는 방법이나 두 변수의 값을 바꾸는 것에 대한 설명은 이전 문제들에서 했으므로 생략하겠다. Q21. TV클래스를 주어진 로직대로 완성하시오. 완성한 후에 실행해서 주어진 실행결과와 일치하는지 확인하라. [참고] 코드를 단순히 하기 위해서 유효성검사는 로직에서 제외했다. class MyTV { boolean isPowerOn; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; void turnOnOff() { // (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다. } void volumeUp() { // (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1증가시킨다. } void volumeDown() { // (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1감소시킨다. } void channelUp() { // (4) channel의 값을 1증가시킨다. // 만일 channel이 MAX_CHANNEL이면, channel의 값을 MIN_CHANNEL로 바꾼다. } void channelDown() { // (5) channel의 값을 1감소시킨다. // 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX_CHANNEL로 바꾼다. } } // class MyTV class Exercise6_21 { public static void main(String args[]) { MyTv t = new MyTv(); t.channel = 100; t.volume = 0; System.out.println("CH:"+t.channel+", VOL:"+ t.volume); t.channelDown(); t.volumeDown(); System.out.println("CH:"+t.channel+", VOL:"+ t.volume); t.volume = 100; t.channelUp(); t.volumeUp(); System.out.println("CH:"+t.channel+", VOL:"+ t.volume); } } [ 실행결과 ] CH:100, VOL:0 CH:99, VOL:0 CH:100, VOL:100 A. class MyTV { boolean isPowerOn; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; void turnOnOff() { // (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다. isPowerOn = !isPowerOn; } void volumeUp() { // (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1증가시킨다. if(volume < MAX_VOLUME) volume++; } void volumeDown() { // (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1감소시킨다. if(volume > MIN_VOLUME) volume–; } void channelUp() { // (4) channel의 값을 1증가시킨다. // 만일 channel이 MAX_CHANNEL이면, channel의 값을 MIN_CHANNEL로 바꾼다. if(channel==MAX_CHANNEL) { channel = MIN_CHANNEL; } else { channel++; } } void channelDown() { // (5) channel의 값을 1감소시킨다. // 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX_CHANNEL로 바꾼다. if(channel==MIN_CHANNEL) { channel = MAX_CHANNEL; } else { channel–; } } } // class MyTV class Exercise6_21 { public static void main(String args[]) { MyTv t = new MyTv(); t.volume = 0; System.out.println(“CH:”+t.channel+”, VOL:”+ t.volume); t.channelDown(); t.volumeDown(); System.out.println(“CH:”+t.channel+”, VOL:”+ t.volume); t.volume = 100; t.channelUp(); t.volumeUp(); System.out.println(“CH:”+t.channel+”, VOL:”+ t.volume); } } Q22. 다음과 같이 정의된 메서드를 작성하고 테스트하시오. 메서드명 : isNumber 기 능 : 주어진 문자열이 모두 숫자로만 이루어져있는지 확인한다. 모두 숫자로만 이루어져 있으면 true를 반환하고, 그렇지 않으면 false를 반환한다. 만일 주어진 문자열이 null이거나 빈문자열“”이라면 false를 반환한다. 반환타입 : boolean 매개변수 : String str – 검사할 문자열 [Hint] String클래스의 charAt(int i)메서드를 사용하면 문자열의 i번째 위치한 문자를 얻을 수 있다. class Exercise6_22 { /* (1) isNumber메서드를 작성하시오. */ public static void main(String[] args) { String str = “123”; System.out.println(str+”는 숫자입니까? “+isNumber(str)); str = “1234o”; System.out.println(str+”는 숫자입니까? “+isNumber(str)); } } [ 실행결과 ] 123는 숫자입니까? true 1234o는 숫자입니까? false A. public static boolean isNumber(String str) { if(str==null || str.equals(“”)) return false; for(int i=0; i< str.length();i++) { char ch = str.charAt(i); if(ch < '0' || ch > ‘9’) { return false; } } // for return true; } 매개변수로 어떤 값이 넘어올지 모르기 때문에 값의 작업을 시작하기 전에 유효성체크는 반드시 해야 한다. 아래의 코드는 넘겨받은 문자열(str)이 null이거나 빈 문자열 (“”)이면 false를 반환한다. if(str==null || str.equals(“”)) return false; 반복문과 charAt(int i)을 이용해서 문자열에서 한 문자씩 차례대로 읽어와 char타입의 변수 ch에 저장한다. for(int i=0; i< str.length();i++) { char ch = str.charAt(i); 읽어온 문자(ch)가 숫자가 아니면 false를 반환한다. if(ch < '0' || ch > ‘9’) { // if(!(‘0’<=ch && ch<='9'))와 같다. return false; } Q23. 다음과 같이 정의된 메서드를 작성하고 테스트하시오. 메서드명 : max 기 능 : 주어진 int형 배열의 값 중에서 제일 큰 값을 반환한다. 만일 주어진 배열이 null이거나 크기가 0인 경우, -999999를 반환한다. 반환타입 : int 매개변수 : int[] arr - 최대값을 구할 배열 class Exercise6_23{ /* (1) max메서드를 작성하시오. */ public static void main(String[] args) { int[] data = {3,2,9,4,7}; System.out.println(java.util.Arrays.toString(data)); System.out.println("최대값:"+max(data)); System.out.println("최대값:"+max(null)); System.out.println("최대값:"+max(new int[]{})); // 크기가 0인 배열 } } [ 실행결과 ] [3, 2, 9, 4, 7] 최대값:9 최대값:-999999 최대값:-999999 A. public static int max(int[] arr) { if(arr==null || arr.length==0) return -999999; int max = arr[0]; // 배열의 첫 번째 값으로 최대값을 초기화 한다. for(int i=1; i< arr.length;i++) { // 배열의 두 번째 값부터 비교한다. if(arr[i] > max) max = arr[i]; } return max; } 매개변수로 넘겨받은 배열 arr이 null이거나 크기가 0이면 -999999을 반환한다. if(arr==null || arr.length==0) return -999999; 배열의 첫 번째 요소(arr[0])로 최대값(max)을 초기화 한다. int max = arr[0]; // 배열의 첫 번째 값으로 최대값을 초기화 한다. 최대값 max를 배열의 첫 번째 값으로 초기화 했으므로 첫 번째값은 비교할 필요가 없다. 그래서 두 번째 값(arr[1])부터 비교한다. 비교해서 최대값보다 크면 그 값을 변수 max에 저장한다. for(int i=1; i< arr.length;i++) { // 배열의 두 번째 값부터 비교한다. if(arr[i] > max) // 배열의 i번 째 요소가 max보다 크면 max = arr[i]; } 반복문을 다 돌고 나면, max에는 배열의 요소 중 가장 큰 값이 저장되어 있을 것이다. 이 값을 반환한다. return max; Q24. 다음과 같이 정의된 메서드를 작성하고 테스트하시오. 메서드명 : abs 기 능 : 주어진 값의 절대값을 반환한다. 반환타입 : int 매개변수 : int value { /* (1) abs메서드를 작성하시오. */ public static void main(String[] args) { int value = 5; System.out.println(value+”의 절대값:”+abs(value)); value = -10; System.out.println(value+”의 절대값:”+abs(value)); } } [ 실행결과 ] 5의 절대값:5 -10의 절대값:10 A. public static int abs(int value) { return value >=0 ? value : -value; } value의 값이 양수이면 그대로 반환하고, 음수이면 부호를 바꿔서 반환하면 된다. if문을 사용해도 되지만 삼항연산자를 이용하면 보다 간결한 코드를 얻을 수 있다. 참고로 if문을 사용한 코드는 다음과 같다. public static int abs(int value) { if(value >=0) { return value; } else { return -value; // value가 음수인 경우, 부호를 변경한다. } } [참고자료] Java의 정석 3rd Edition / 남궁성 / https://cafe.naver.com/javachobostudy 728×90

04장 연습문제

(연습문제 풀이 : https://wikidocs.net/157712#04) Q1 다음 코드의 출력 결과는 무엇일까? (눈으로 해석하고 풀어보자.) public class Sample { public static void main(String[] args) { String a = “write once, run anywhere”; if (a.contains(“wife”)) { System.out.println(“wife”); } else if (a.contains(“once”) && !a.contains(“run”)) { System.out.println(“once”); } else if (!a.contains(“everywhere”)) { System.out.println(“everywhere”); } else if (a.contains(“anywhere”)) { System.out.println(“anywhere”); } else { System.out.println(“none”); } } } Q2 while문을 사용해 1부터 1000까지의 자연수 중 3의 배수의 합을 구해 보자. Q3 while문 또는 for 문을 사용하여 다음과 같이 별( * )을 표시하는 프로그램을 작성해 보자. * ** *** **** ***** Q4 for문을 사용해 1부터 100까지의 숫자를 출력해 보자. Q5 A 학급에 총 10명의 학생이 있다. 이 학생들의 중간고사 점수는 다음과 같다. int[] marks = {70, 60, 55, 75, 95, 90, 80, 80, 85, 100}; for each 문을 사용하여 A 학급의 평균 점수를 구해 보자.

자바의 정석 7장 (19일차)

728×90 섯다 카드 한벌 생성 섯다카드 클래스 자체를 array로 지정하여 선언 지정한 후 if로 조건문을 선언하여 숫자 조건 추가 숫자를 배정할 때 객체를 선언하여 그 멤버변수에 숫자를 배정 위의 메인클래스에서 for문으로 출력 // 섯다카드 20장을 포함하는 섯다카드 한벌(sutdadeck클래스)를 정의한 것. // 섯다카드 20장ㅇ을 담는 sutdacard배열을 초기화하시오. // 섯다카드는 1-10까지 숫자가 적힌 카드가 한장씩 있고 1,3,8일 경우 둘증의 한장은 Kwang이어야 함 // public class Chap7 { public static void main(String[] args) { SutdaDeck deck = new SutdaDeck(); for(int i = 0; i =MIN_CHANNEL) { PrevChannel = this.channel; // 바뀌기 전의 채널을 변수에 저장 this.channel = channel; } else { System.out.println(“올바른 채널이 아닙니다”); return; } } public int getVolume() { return volume; } public void setVolume(int volume) { if(volume<=MAX_VOLUME && volume>=MIN_VOLUME) { this.volume = volume; } else { System.out.println(“올바른 볼륨이 아닙니다”); return; } } } 내부 변수 선언 선언 1 package LecturePracticalExam; public class Chap7_InnerClass { public static void main(String[] args) { Outer o = new Outer(); Outer.Inner i = o.new Inner(); System.out.println(i.iv); } } //Outer클래스의 내부 클래스 Inner의 멤버변수 iv의 값을 출력하시오. class Outer { // 외부 클래스 class Inner { // 내부 클래스(인스턴스 클래스) int iv=100; } } 선언 2 package LecturePracticalExam; import LecturePracticalExam.Outer2.Inner2; public class Chap7_InnerClass2 { public static void main(String[] args) { Outer2.Inner2 i = new Inner2(); System.out.println(i.iv); } } // static 변수이기때문에 따로 객체생성 필요없음 //Outer클래스의 내부 클래스 Inner의 멤버변수 iv의 값을 출력하시오. class Outer2 { // 외부 클래스 static class Inner2 { // 내부 클래스(static클래스) int iv=200; } } 선언 3 package LecturePracticalExam; public class Chap7_InnerClass3 { public static void main(String[] args) { // 4) Outer3 o = new Outer3(); Outer3.Inner i = o.new Inner(); i.method1(); } } class Outer3 { int value=10; // Outer.this.value class Inner { int value=20; void method1() { int value=30; System.out.println(value); //1 System.out.println(this.value); //2 System.out.println(Outer3.this.value); //3 } } } //다음과 같은 실행결과를 얻도록 (1)~(4)의 코드를 완성하시오. //30 //20 //10 익명 클래스 선언 아래의 클래스를 익명으로 선언하여 객체 선언 줄이기 package LecturePracticalExam; import java.awt.*; import java.awt.event.*; //아래의 EventHandler를 익명 클래스(anonymous class)로 변경하시오. public class AnonymousClass { public static void main(String[] args){ Frame f = new Frame(); // f.addWindowListener(new EventHandler()); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { e.getWindow().setVisible(false); e.getWindow().dispose(); System.exit(0); } }); } } //class EventHandler extends WindowAdapter{ // public void windowClosing(WindowEvent e) { // e.getWindow().setVisible(false); // e.getWindow().dispose(); // System.exit(0); // } // } //} 728×90

객체지향 프로그래밍 연습 문제

객체지향 프로그래밍 – 클래스1 인스턴스 변수와 클래스 변수 사용하기 메서드 구조 사용하기 가변인자 사용하기 1 가변인자 사용하기 2 – 디컴파일해서 확인해보면 좀 더 이해하기 쉽다. 재귀함수 사용하기 인스턴스를 생성하는 소스코드 만들기 1 인스턴스를 생성하는 소스코드 만들기 1 인스턴스를 생성하는 소스코드 만들기 2 공감수 0

[Java] 객체지향(2) 연습 정리

회원이 대여한 비디오 출력 예제(캡슐화) Video.java public class Video { //video 관련 멤버변수 private String num; private String title; private String actor; //디폴트 생성자 public Video() {} public Video(String num, String title, String actor) { this.num = num; //this는 클래스 자기 자신을 가르킨다. this.title = title; //지역변수를 멤버변수에 대입 this.actor = actor; } //getter, setter 메서드 public String getNum() { return num; } public void setNum(String num) { this.num = num; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getActor() { return actor; } public void setActor(String actor) { this.actor = actor; } } 캡슐화는 클래스 내 중요한 데이터(변수)나 기능을 외부로부터 접근하지 못하도록 한다. 변수 앞에 자신의 클래스에서만 접근할 수 있는 접근제어자 private을 붙여준다. get/set 메서드를 통한 접근으로 변수에 값을 넣고 뺄 수 있도록 한다. GeneralMember.java public class GeneralMember { //회원 관련 멤버변수 private String id , name, address; private Video rentalVideo; //객체간 상호관계 public GeneralMember() {} //디폴트 생성자 public GeneralMember(String id, String name, String address) { this.id = id; this.name = name; this.address = address; } public void printMember() { System.out.println(“회원의 아이디 : ” + id); System.out.println(“회원의 이름 : ” + name); System.out.println(“회원의 주소 : ” + address); System.out.println(“회원이 대여한 비디오 번호 : ” + rentalVideo.getNum()); System.out.println(“회원이 대여한 비디오 제목 : ” + rentalVideo.getTitle()); System.out.println(“회원이 대여한 비디오 배우 : ” + rentalVideo.getActor()); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Video getRentalVideo() { return rentalVideo; } public void setRentalVideo(Video rentalVideo) { this.rentalVideo = rentalVideo; } } Video 클래스 타입의 참조변수 rentalVideo를 선언하여 객체 간의 상호관계를 맺어준다. get 메서드를 통해 Video 객체에 데이터를 가져온다. VideoMain.java public class VideoMain { public static void main(String[] args) { Video v1 = new Video(“1”, “반도”, “강동원”); Video v2 = new Video(“2”, “나는 살아있다.”, “유아인”); GeneralMember gm = new GeneralMember(“aaa”, “홍길동”, “서울”); gm.setRentalVideo(v2); gm.printMember(); } } Video 객체 생성 후 초기화, GeneralMember 객체 생성 후 초기화 참조 변수 gm에 set()를 이용하여 Video객체에 저장된 데이터를 넣는다. printMember()에 작성한 get()가 호출되어 비디오에 대한 정보가 출력된다. 전화번호부 추가, 출력, 검색, 수정, 삭제 기능 구현 PhoneInfo.java public class PhoneInfo { //상태 : 이름, 전화번호, 생년월일 //기능 : 1인 전화내역 출력기능, private String name; private String phoneNo; private String birth; public PhoneInfo() {} public PhoneInfo(String name, String phoneNo, String birth) { this.name = name; this.phoneNo = phoneNo; this.birth = birth; } public void show() { System.out.println(“이름 : ” + name); System.out.println(“전화번호 : ” + phoneNo); System.out.println(“생년월일 : ” + birth); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhoneNo() { return phoneNo; } public void setPhoneNo(String phoneNo) { this.phoneNo = phoneNo; } public String getBirth() { return birth; } public void setBirth(String birth) { this.birth = birth; } } 멤버변수, 생성자, set/get 메서드 출력과 검색에 사용할 show() 메서드 Manager.java import java.util.Scanner; public class Manager { PhoneInfo arr[]; Scanner sc = new Scanner(System.in); private String name = “”; private int count = 0; public Manager() { arr = new PhoneInfo[10]; // 객체생성과 동시에 배열 초기화 } public void addPhoneInfor() { // 이름, 전화번호, 생년월일 입력 System.out.println(“이름 : “); String name = sc.nextLine(); System.out.println(“전화번호 : “); String phoneNo = sc.nextLine(); System.out.println(“생년월일 : “); String birth = sc.nextLine(); // PhoneInfo 객체 생성 // 배열에 추가 => 객체가 생성될 때마다 count 증가 arr[count++] = new PhoneInfo(name, phoneNo, birth); } public void listPhoneInfo() { // 배열에 있는 모든 PhoneInfo 객체를 출력 // 현재 배열 안에 객체의 개수인 count만큼 for문을 수행. for (int i = 0; i < count; i++) { arr[i].show(); } } public void searchPhoneInfo() { // 이름을 기준으로 검색 System.out.println("이름 : "); String name = sc.nextLine(); int idx = -1; for (int i = 0; i < count; i++) { PhoneInfo info = arr[i]; if (name.equals(info.getName())) { info.show(); idx = i; } } if (idx == -1) { System.out.println("찾을 수 없습니다."); } } public void updatePhoneInfo() { System.out.println("이름 : "); String name = sc.nextLine(); int idx = -1; for (int i = 0; i < count; i++) { PhoneInfo info = arr[i]; if (name.equals(info.getName())) { System.out.println("수정 전화번호 입력 : "); String phoneNo = sc.nextLine(); info.setPhoneNo(phoneNo); System.out.println("수정 생년월일 입력 : "); String birth = sc.nextLine(); info.setBirth(birth); idx = i; break; } } } public void deletePhoneInfo() { System.out.println("이름 : "); String name = sc.nextLine(); int idx = -1; for (int i = 0; i < count; i++) { PhoneInfo info = arr[i]; if (name.equals(info.getName())) { idx = i; } } for(int i = idx; i < count -1; i++) { arr[i] = arr[i + 1]; } count = count -1; } } 객체를 담을 배열 선언 및 생성 배열 안에 객체의 수를 파악하기 위해 count 변수를 선언 addPhoneInfo()에서 PhoneInfo 객체가 생성될 때마다 count가 1씩 증가한다. (count++) deletePhoneInfo() 삭제할 객체의 인덱스 위치를 구하고 뒤에 있는 인덱스를 하나씩 앞으로 밀어준다. deletePhoneInfo() 마지막으로 배열 안에 객체의 수를 맞춰주기 위해 count-1 PhoneInfoMain.java import java.util.Scanner; public class PhoneInfoMain { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Manager m = new Manager(); while (true) { System.out.println("1.추가 2.출력 3.검색 4.수정 5.삭제 6.종료"); System.out.println("선택 : "); String menu = sc.nextLine(); switch (menu) { case "1": m.addPhoneInfor(); break; case "2": m.listPhoneInfo(); break; case "3": m.searchPhoneInfo(); break; case "4": m.updatePhoneInfo(); break; case "5": m.deletePhoneInfo(); case "6": System.out.println("프로그램 종료"); return; } } } } [Java] 객체 간 협력, 교통수단 예제문제 / 2021.07.26 728×90 * 참고자료 : Do it! 자바 프로그래밍 입문 객체 지향 프로그램은 객체를 정의하고 객체 간 협력으로 만든다. 객체의 협력이 어떻게 이루어지는지 알아보자. 학생이 학교에 가기 위해 수행하는 여러 과정을 객체 지향 프로그램으로 만들 수 있다. 이 예제에서는 학생이 버스, 지하철, 택시를 타고 가는 것을 객체 지향 프로그래밍해보겠다. (1) 학생 클래스 구현하기 학생 클래스는 “이름”, “가진 돈”을 멤버 변수로 가진다. 그리고 “버스를 탄다”, “지하철을 탄다”, “택시를 탄다”, “학생의 현재 정보를 보여준다”를 메서드로 가진다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package cooperation; public class Student { public String studentName; // 학생 이름 public int money; // 가진 돈 // 매개변수로 학생이름, 가진 돈을 받는 생성자 public Student( String studentName, int money) { this .studentName = studentName; this .money = money; } // 버스를 탄다 public void takeBus(Bus bus) { bus.take( 1000 ); this .money – = 1000 ; // 버스요금 1000원을 지불 } // 지하철을 탄다 public void takeSubway(Subway subway) { subway.take( 1500 ); this .money – = 1500 ; // 지하철 요금 1500원을 지불 } // 택시를 탄다 public void takeTaxi(Taxi taxi) { taxi.take( 10000 ); this .money – = 10000 ; // 택시 요금 10000원 지불 } // 학생의 현재 정보를 출력하는 메서드 public void showInfo() { System . out . println (studentName + “님의 남은 돈은” + money + “입니다.” ); } } Colored by Color Scripter cs (2) 버스 클래스 구현하기 버스 클래스는 “버스번호”, “승객수”, “버스 수입”을 멤버 변수로 가진다. 그리고 “승객이 버스에 탄 경우”, “버스의 현재 정보를 보여준다”를 메서드로 가진다. 학생 한명이 버스에 탄다면 버스 요금을 1000원 받고 승객 수가 한 명 증가한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package cooperation; public class Bus { int busNumber; // 버스 번호 int passengerCount; // 승객 수 int money; // 버스 수입 // 매개변수로 버스 번호를 받는 생성자 public Bus( int busNumber) { this .busNumber = busNumber; } // 승객이 버스에 탈 때 public void take( int money) { this .money + = money; // 버스 요금 (매개변수 money)만큼 버스 수입이 증가 passengerCount + + ; // 승객 수 증가 } // 버스의 현재 정보 출력 public void showInfo() { System . out . println ( “버스 ” + busNumber + “번의 승객은 ” + passengerCount + “명이고, 수입은” + money + “입니다.” ); } } Colored by Color Scripter cs (3) 지하철 클래스 구현하기 버스 클래스는 “지하철 노선”, “승객수”, “지하철 수입”을 멤버 변수로 가진다. 그리고 “승객이 지하철에 탄 경우”, “지하철의 현재 정보를 보여준다”를 메서드로 가진다. 학생 한명이 버스에 탄다면 지하철 요금을 1500원 받고 승객 수가 한 명 증가한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package cooperation; public class Subway { String lineNumber; // 지하철 노선 int passengerCount; // 승객 수 int money; // 지하철 수입 // 매개변수로 지하철 노선을 받는 생성자 public Subway( String lineNumber) { this .lineNumber = lineNumber; } // 승객이 지하철에 탄다면 public void take( int money) { this .money = money; // 지하철 요금 (매개변수 money)만큼 지하철 수입이 증가 passengerCount + + ; // 승객 수 증가 } // 지하철 현재 정보 출력 public void showInfo() { System . out . println (lineNumber + “의 승객은 ” + passengerCount + “명이고, 수입은 ” + money + “입니다.” ); } } Colored by Color Scripter cs (4) 택시 클래스 구현하기 택시 클래스는 “택시 번호”, “승객수”, “택시 수입”을 멤버 변수로 가진다. 그리고 “승객이 택시에 탄 경우”, “택시의 현재 정보를 보여준다”를 메서드로 가진다. 학생 한명이 버스에 탄다면 택시 요금을 10000원 받고 승객 수가 한 명 증가한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package cooperation; public class Taxi { int taxiNumber; // 택시 번호 int passengerCount; // 택시 승객 수 int money; // 택시 수입 // 매개변수로 택시 변수를 받는 생성자 public Taxi( int taxiNumber) { this .taxiNumber = taxiNumber; } // 택시에 승객이 타면 public void take( int money) { this .money + = money; // 택시 요금(매개변수 money)만큼 택시 수입 증가 passengerCount + + ; // 승객 수 증가 } // 택시 현재 정보 출력 public void showInfo() { System . out . println (taxiNumber + “의 승객은” + passengerCount + “명이고, 수입은 ” + money + “원이다.” ); } } Colored by Color Scripter cs (5) 학생, 버스, 지하철, 택시 객체 협력하기 세 학생 James, Tomas, Edward가 있습니다. 이 세 학생은 각각 버스, 지하철, 택시를 타고 학교에 갑니다. 세 학생이 교통 수단을 이용한 후 각자가 가진 돈의 변화와 버스, 지하철, 택시의 수입을 알아보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package cooperation; public class TakeTrans { public static void main( String [] args) { // 학생 세 명 생성 Student studentJames = new Student( “James” , 5000 ); Student studentTomas = new Student( “Tomas” , 10000 ); Student studentEdward = new Student( “Edward” , 20000 ); Bus bus100 = new Bus( 100 ); // 노선 번호가 100인 버스 생성 studentJames.takeBus(bus100); // James가 100번 버스를 탐 studentJames.showInfo(); // James의 정보 출력 bus100.showInfo(); // bus의 정보 출력 Subway subwayGreen = new Subway( “2호선” ); // 노선 번호가 2호선인 지하철 생성 studentTomas.takeSubway(subwayGreen); // Tomas가 2호선을 탐 studentTomas.showInfo(); // Tomas의 정보 출력 subwayGreen.showInfo(); // subway의 정보 출력 Taxi taxi4534 = new Taxi( 4534 ); // 택시 번호가 4534인 택시 생성 studentEdward.takeTaxi(taxi4534); // Edward가 4534번 택시를 탐 studentEdward.showInfo(); // Edward의 정보 출력 taxi4534.showInfo(); // taxi의 정보 출력 } } Colored by Color Scripter cs 학생들이 교통수단을 타는 과정을 그림으로 나타내 보았다. 실행결과 : 728×90 키워드에 대한 정보 자바 객체 지향 연습 문제 다음은 Bing에서 자바 객체 지향 연습 문제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다. 이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다! 사람들이 주제에 대해 자주 검색하는 키워드 [자바 기초 26] 연습문제: 객체지향 자바 프로그래밍 입문 실습 연습 문제 객체지향 OOP 자바 객체지향 프로그래밍 자바 static 메소드 자바 클래스 구현 자바 객체 생성 자바 생성자 자바 클래스 메소드 [자바 #기초 #26] #연습문제: #객체지향 YouTube에서 자바 객체 지향 연습 문제 주제의 다른 동영상 보기 주제에 대한 기사를 시청해 주셔서 감사합니다 [자바 기초 26] 연습문제: 객체지향 | 자바 객체 지향 연습 문제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

04장 연습문제

(연습문제 풀이 : https://wikidocs.net/157712#04)

Q1

다음 코드의 출력 결과는 무엇일까? (눈으로 해석하고 풀어보자.)

public class Sample { public static void main(String[] args) { String a = “write once, run anywhere”; if (a.contains(“wife”)) { System.out.println(“wife”); } else if (a.contains(“once”) && !a.contains(“run”)) { System.out.println(“once”); } else if (!a.contains(“everywhere”)) { System.out.println(“everywhere”); } else if (a.contains(“anywhere”)) { System.out.println(“anywhere”); } else { System.out.println(“none”); } } }

Q2

while문을 사용해 1부터 1000까지의 자연수 중 3의 배수의 합을 구해 보자.

Q3

while문 또는 for 문을 사용하여 다음과 같이 별( * )을 표시하는 프로그램을 작성해 보자.

* ** *** **** *****

Q4

for문을 사용해 1부터 100까지의 숫자를 출력해 보자.

Q5

A 학급에 총 10명의 학생이 있다. 이 학생들의 중간고사 점수는 다음과 같다.

int[] marks = {70, 60, 55, 75, 95, 90, 80, 80, 85, 100};

for each 문을 사용하여 A 학급의 평균 점수를 구해 보자.

객체지향 프로그래밍 연습 문제

객체지향 프로그래밍 – 클래스1 인스턴스 변수와 클래스 변수 사용하기 메서드 구조 사용하기 가변인자 사용하기 1 가변인자 사용하기 2 – 디컴파일해서 확인해보면 좀 더 이해하기 쉽다. 재귀함수 사용하기 인스턴스를 생성하는 소스코드 만들기 1 인스턴스를 생성하는 소스코드 만들기 1 인스턴스를 생성하는 소스코드 만들기 2 공감수 0

[자바 기초 26] 연습문제: 객체지향 32 개의 새로운 답변이 업데이트되었습니다. – Ru.taphoamini.com

당신은 주제를 찾고 있습니까 “객체 지향 프로그래밍 예제 – [자바 기초 26] 연습문제: 객체지향“? 다음 카테고리의 웹사이트 https://ru.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://ru.taphoamini.com/photos. 바로 아래에서 답을 찾을 수 있습니다. 작성자 홍팍 이(가) 작성한 기사에는 조회수 3,052회 및 좋아요 35개 개의 좋아요가 있습니다.

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

자바를 통한 객체지향 연습문제를 풀어봅시다.

도서구매: http://www.yes24.com/Product/Goods/104740689

강의자료: https://cloudstudying.kr/courses/61

실습문제: https://cloudstudying.kr/lectures/200#tab

강의문의: [email protected]

카톡ID: chaesam

객체 지향 프로그래밍에 대해 배운 것들을 사용해 학생, 버스, 지하철 세 가지의 객체가 서로 상호작용하는 것을 프로그래밍 한 예제다.

+ 여기에 더 보기

Source: dogrushdev.tistory.com

Date Published: 3/29/2022

View: 9805

내가 정립한 객체지향 프로그래밍은 “세계의 축소판”이다. 여러가지 객체들이 각기 다른 도구(변수)들을 가지고 각자의 동작(메소드)를 해내는 것이다.

+ 자세한 내용은 여기를 클릭하십시오

Source: minwoohi.tistory.com

Date Published: 8/22/2022

View: 9185

자바는 객체지향(Object Oriented) 프로그래밍 언어이다. 객체지향에는 클래스, 객체, 인스턴스, 상속, 인터페이스, 다형성, 추상화 등의 많은 개념들이 존재한다.

+ 더 읽기

Source: wikidocs.net

Date Published: 3/27/2022

View: 1848

예를들어, 새로 합류한 개발자가 사용자의 적립금을 출력하는 로직을 작성하기 위해서 로직을 아래와 같이 고쳤다고 해보자. 이 예제는 프로그램으로써 …

+ 여기에 더 보기

Source: opentutorials.org

Date Published: 8/30/2022

View: 9160

객체지향 프로그래밍에서 객체를 만들려면 객체를 바로 만들지 못하고 항상 클래스()라는 것을 만든 후에 그 클래스를 이용하여 객체를 만들어야 한다. 위 예제 …

+ 여기에 표시

Source: datascienceschool.net

Date Published: 4/3/2022

View: 9758

이 예제에서는 학생이 버스, 지하철, 택시를 타고 가는 것을 객체 지향 프로그래밍해보겠다. (1) 학생 클래스 구현하기 학생 클래스는 “이름”, …

+ 여기에 표시

Source: cow-kite24.tistory.com

Date Published: 1/4/2021

View: 3396

객체 지향 프로그래밍. OOP라고 한다. 프로그램을 객체의 조립으로 만드는 방식이다. OOP는 프로그램의 관리/재사용/확장에 좋다.

+ 여기에 자세히 보기

Source: cloudstudying.kr

Date Published: 1/20/2022

View: 1232

오늘은 JAVA 코딩을 통한 객체 지향 프로그래밍 (OOP : Object Oriented Programming) 의 특징을 알아볼 것이다! 특징은 상속, 다형성, 추상화, …

+ 자세한 내용은 여기를 클릭하십시오

Source: jin8371.tistory.com

Date Published: 10/3/2021

View: 9913

주제와 관련된 더 많은 사진을 참조하십시오 [자바 기초 26] 연습문제: 객체지향. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

Subway 7 got 2 passengers and earned 3000 won

Subway 2 got 1 passengers and earned 1500 won

Bus 100 got 1 passengers and earned 1000 won

package classpart; public class Test { public static void main(String[] args) { Student stu1 = new Student(“John”, 10000); Student stu2 = new Student(“Kelly”, 20000); Student stu3 = new Student(“Harry”, 14000); Bus bus100 = new Bus(100); Subway subway2 = new Subway(2); Subway subway7 = new Subway(7); stu1.takeBus(bus100); stu2.takeSubway(subway2); stu1.takeSubway(subway7); stu3.takeSubway(subway7); stu1.showInfo(); stu2.showInfo(); stu3.showInfo(); bus100.showInfo(); subway2.showInfo(); subway7.showInfo(); } }

package classpart; public class Subway { int subwayNum; int intake = 0; int passenger; public Subway(int num) { this.subwayNum = num; } public void take(int passenger) { this.passenger++; this.intake+=1500; } public int getsubwayNum() { return subwayNum; } public int getIntake() { return intake; } public int getPassenger() { return passenger; } public void showInfo() { System.out.println(“Subway “+this.getsubwayNum()+” got “+this.getPassenger()+” passengers and earned “+this.getIntake()+” won”); } }

package classpart; public class Bus { int busNum; int intake = 0; int passenger; public Bus(int num) { this.busNum = num; } public void take(int passenger) { this.passenger++; this.intake+=1000; } public int getBusNum() { return busNum; } public int getIntake() { return intake; } public int getPassenger() { return passenger; } public void showInfo() { System.out.println(“Bus “+this.getBusNum()+” got “+this.getPassenger()+” passengers and earned “+this.getIntake()+” won”); } }

package classpart; public class Student { String name; int money; public Student(String name, int money) { this.name = name; this.money = money; } public void takeBus(Bus bus) { this.money -= 1000; bus.take(1); } public void takeSubway(Subway subway) { this.money -= 1500; subway.take(1); } public String getName() { return name; } public int getMoney() { return money; } public void showInfo() { System.out.println(this.getName()+” has “+this.getMoney()); } }

def __init__(self, left, right): self._left = left self._right = right

class Calculator: def __init__(self, left, right): self._left = left self._right = right def sum(self): return self._left + self._right class User: def __init__(self, right): self._right = right def my(self): return self._right c = Calculator(1, 2) print c.sum() u = User(10000) print u.my()

left = 1 right = 2 def sum(): global left, right return left + right right = 10000 def my(): global right return right print sum() #10001 print my() #10000

left = 1 right = 2 def sum(): global left, right return left + right print sum()

class Character ( object ): def __init__ ( self ): self . life = 1000 self . strength = 10 self . intelligence = 10 def attacked ( self ): self . life -= 10 print ( “공격받음! 생명력 =” , self . life ) def attack ( self ): print ( “공격!” )

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package cooperation; public class TakeTrans { public static void main( String [] args) { // 학생 세 명 생성 Student studentJames = new Student( “James” , 5000 ); Student studentTomas = new Student( “Tomas” , 10000 ); Student studentEdward = new Student( “Edward” , 20000 ); Bus bus100 = new Bus( 100 ); // 노선 번호가 100인 버스 생성 studentJames.takeBus(bus100); // James가 100번 버스를 탐 studentJames.showInfo(); // James의 정보 출력 bus100.showInfo(); // bus의 정보 출력 Subway subwayGreen = new Subway( “2호선” ); // 노선 번호가 2호선인 지하철 생성 studentTomas.takeSubway(subwayGreen); // Tomas가 2호선을 탐 studentTomas.showInfo(); // Tomas의 정보 출력 subwayGreen.showInfo(); // subway의 정보 출력 Taxi taxi4534 = new Taxi( 4534 ); // 택시 번호가 4534인 택시 생성 studentEdward.takeTaxi(taxi4534); // Edward가 4534번 택시를 탐 studentEdward.showInfo(); // Edward의 정보 출력 taxi4534.showInfo(); // taxi의 정보 출력 } } Colored by Color Scripter cs 학생들이 교통수단을 타는 과정을 그림으로 나타내 보았다. 실행결과 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package cooperation; public class Taxi { int taxiNumber; // 택시 번호 int passengerCount; // 택시 승객 수 int money; // 택시 수입 // 매개변수로 택시 변수를 받는 생성자 public Taxi( int taxiNumber) { this .taxiNumber = taxiNumber; } // 택시에 승객이 타면 public void take( int money) { this .money + = money; // 택시 요금(매개변수 money)만큼 택시 수입 증가 passengerCount + + ; // 승객 수 증가 } // 택시 현재 정보 출력 public void showInfo() { System . out . println (taxiNumber + “의 승객은” + passengerCount + “명이고, 수입은 ” + money + “원이다.” ); } } Colored by Color Scripter cs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package cooperation; public class Subway { String lineNumber; // 지하철 노선 int passengerCount; // 승객 수 int money; // 지하철 수입 // 매개변수로 지하철 노선을 받는 생성자 public Subway( String lineNumber) { this .lineNumber = lineNumber; } // 승객이 지하철에 탄다면 public void take( int money) { this .money = money; // 지하철 요금 (매개변수 money)만큼 지하철 수입이 증가 passengerCount + + ; // 승객 수 증가 } // 지하철 현재 정보 출력 public void showInfo() { System . out . println (lineNumber + “의 승객은 ” + passengerCount + “명이고, 수입은 ” + money + “입니다.” ); } } Colored by Color Scripter cs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package cooperation; public class Bus { int busNumber; // 버스 번호 int passengerCount; // 승객 수 int money; // 버스 수입 // 매개변수로 버스 번호를 받는 생성자 public Bus( int busNumber) { this .busNumber = busNumber; } // 승객이 버스에 탈 때 public void take( int money) { this .money + = money; // 버스 요금 (매개변수 money)만큼 버스 수입이 증가 passengerCount + + ; // 승객 수 증가 } // 버스의 현재 정보 출력 public void showInfo() { System . out . println ( “버스 ” + busNumber + “번의 승객은 ” + passengerCount + “명이고, 수입은” + money + “입니다.” ); } } Colored by Color Scripter cs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package cooperation; public class Student { public String studentName; // 학생 이름 public int money; // 가진 돈 // 매개변수로 학생이름, 가진 돈을 받는 생성자 public Student( String studentName, int money) { this .studentName = studentName; this .money = money; } // 버스를 탄다 public void takeBus(Bus bus) { bus.take( 1000 ); this .money – = 1000 ; // 버스요금 1000원을 지불 } // 지하철을 탄다 public void takeSubway(Subway subway) { subway.take( 1500 ); this .money – = 1500 ; // 지하철 요금 1500원을 지불 } // 택시를 탄다 public void takeTaxi(Taxi taxi) { taxi.take( 10000 ); this .money – = 10000 ; // 택시 요금 10000원 지불 } // 학생의 현재 정보를 출력하는 메서드 public void showInfo() { System . out . println (studentName + “님의 남은 돈은” + money + “입니다.” ); } } Colored by Color Scripter cs

* 참고자료 : Do it! 자바 프로그래밍 입문

연습문제 D – 객체지향 프로그래밍

# 연습문제 D – 객체지향 프로그래밍 ## 09 클래스와 객체 — ### 이론 요약 ![클라우드스터딩-자바-클래스와-객체-요약](https://i.imgur.com/zi6B90d.png) #### 객체 지향 프로그래밍 – OOP라고 한다. 프로그램을 객체의 조립으로 만드는 방식이다. – OOP는 프로그램의 관리/재사용/확장에 좋다. #### 클래스 vs 객체 – 클래스는 객체를 만들기 위한 설계도이다. – 객체의 또 다른 표현으로는 인스턴스(instance)가 있다. – 때문에 클래스로 객체를 만드는 것을 “인스턴스화”라고 한다. #### 클래스 설계 및 구현 – 클래스는 필드(상태)와 메소드(동작)로 구성된다. – 클래스를 도식화한 것을 “클래스 다이어그램”이라 한다. – 클래스 다이어그램 보고 코드를 작성할 줄 알아야 한다. ### 실습 리뷰 정사각형 객체의 넓이를 구하는 예. “` public class SquareTest { public static void main(String[] args) { /* 1. 객체 생성 */ Square s = new Square(); /* 2. 필드 초기화(값 변경) */ s.length = 4; /* 3. 결과 출력 */ System.out.printf(“한 변의 길이가 %d인 정사각형의 넓이: %d”, s.length, s.area()); } } /* 4. 정사각형 클래스 구현 */ class Square { int length; // 길이 // 넓이 반환 int area() { return length * length; } } “` ## 10 생성자 — ### 이론 요약 ![클라우드스터딩-자바-생성자-요약](https://i.imgur.com/pMmmkPn.png) #### 생성자 – 생성자는 객체를 만드는 특별한 메소드다. – 생성자는 역할은, 객체 생성과 필드 초기화이다. #### 생성자 특징 – 생성자는, 호출과 정의로 나뉜다. – 생성자명은, 클래스명과 같아야 한다. – 리턴 타입은 표기하지 않는다. (void 아님) ### 실습 리뷰 마린과 메딕 객체의 상호 작용 “` public class Starcraft { public static void main(String[] args) { // 객체 생성 Marine marine = new Marine(“마린”, 80); Medic medic = new Medic(“메딕”, 60); // 마린 스팀팩 버프~ marine.stimpack(); // 메딕의 치료 -> 마린 medic.heal(marine); } } // 마린 클래스 class Marine { // 필드 String name; int hp; // 생성자 public Marine(String name, int hp) { this.name = name; this.hp = hp; } // 메소드 public void stimpack() { System.out.printf(“[%s]의 스팀팩! HP: %d -> “, name, hp); hp -= 10; System.out.printf(“%d

“,hp); } } // 메딕 클래스 class Medic { // 필드 String name; int hp; // 생성자 public Medic(String name, int hp) { this.name = name; this.hp = hp; } // 메소드 public void heal(Marine target) { System.out.printf(“[%s]의 치유! %s HP(%d -> “, name, target.name, target.hp); target.hp += 10; System.out.printf(“%d)

“, target.hp); } } “` ## 11 레퍼런스 변수와 static — ### 이론 요약 ![클라우드스터딩-자바-레퍼런스와-static-요약](https://i.imgur.com/8SjXUXO.png) #### 레퍼런스 변수 – 레퍼런스 변수란, 객체를 가리키는 변수다. – 기본형 변수는 값을 직접 저장하나, 레퍼런스 변수는 객체의 위치를 가리킨다. #### static 키워드 – static 키워드는 필드와 메소드에 적용될 수 있다. #### 클래스 변수 – 클래스 변수란, 클래스 영역에 존재한다. – 인스턴스 변수란, 객체 내부에 존재한다. #### 인스턴스 변수 – 클래스 메소드란, 주체 객체가 없이 수행되는 메소드다. – 인스턴스 메소드란, 주체 객체가 실행하는 메소드다. ### 실습 리뷰 두 점 사이의 거리 “` public class PointTest { public static void main(String[] args) { // 객체 생성 Point p1 = new Point(0, 0); Point p2 = new Point(3, 4); // 거리 계산 double dist = Point.distance(p1, p2); // 결과 출력 System.out.printf(“두 점 A%s, B%s 사이의 거리: %.2f”, p1.toStr(), p2.toStr(), dist); } } class Point { int x; int y; Point (int _x, int _y) { x = _x; y = _y; } String toStr() { return String.format(“(%d, %d)”, x, y); } static double distance(Point p, Point q) { double dX = p.x – q.x; // x좌표의 변화량 double dY = p.y – q.y; // y좌표의 변화량 return Math.sqrt((dX * dX) + (dY * dY)); } } “` ## 확인하기 —

## 도서구매

[Java] 객체지향(2) 연습 정리

회원이 대여한 비디오 출력 예제(캡슐화)

Video.java

public class Video { //video 관련 멤버변수 private String num; private String title; private String actor; //디폴트 생성자 public Video() {} public Video(String num, String title, String actor) { this.num = num; //this는 클래스 자기 자신을 가르킨다. this.title = title; //지역변수를 멤버변수에 대입 this.actor = actor; } //getter, setter 메서드 public String getNum() { return num; } public void setNum(String num) { this.num = num; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getActor() { return actor; } public void setActor(String actor) { this.actor = actor; } }

캡슐화는 클래스 내 중요한 데이터(변수)나 기능을 외부로부터 접근하지 못하도록 한다.

변수 앞에 자신의 클래스에서만 접근할 수 있는 접근제어자 private을 붙여준다.

get/set 메서드를 통한 접근으로 변수에 값을 넣고 뺄 수 있도록 한다.

GeneralMember.java

public class GeneralMember { //회원 관련 멤버변수 private String id , name, address; private Video rentalVideo; //객체간 상호관계 public GeneralMember() {} //디폴트 생성자 public GeneralMember(String id, String name, String address) { this.id = id; this.name = name; this.address = address; } public void printMember() { System.out.println(“회원의 아이디 : ” + id); System.out.println(“회원의 이름 : ” + name); System.out.println(“회원의 주소 : ” + address); System.out.println(“회원이 대여한 비디오 번호 : ” + rentalVideo.getNum()); System.out.println(“회원이 대여한 비디오 제목 : ” + rentalVideo.getTitle()); System.out.println(“회원이 대여한 비디오 배우 : ” + rentalVideo.getActor()); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Video getRentalVideo() { return rentalVideo; } public void setRentalVideo(Video rentalVideo) { this.rentalVideo = rentalVideo; } }

Video 클래스 타입의 참조변수 rentalVideo를 선언하여 객체 간의 상호관계를 맺어준다.

get 메서드를 통해 Video 객체에 데이터를 가져온다.

VideoMain.java

public class VideoMain { public static void main(String[] args) { Video v1 = new Video(“1”, “반도”, “강동원”); Video v2 = new Video(“2”, “나는 살아있다.”, “유아인”); GeneralMember gm = new GeneralMember(“aaa”, “홍길동”, “서울”); gm.setRentalVideo(v2); gm.printMember(); } }

Video 객체 생성 후 초기화, GeneralMember 객체 생성 후 초기화

참조 변수 gm에 set()를 이용하여 Video객체에 저장된 데이터를 넣는다.

printMember()에 작성한 get()가 호출되어 비디오에 대한 정보가 출력된다.

전화번호부 추가, 출력, 검색, 수정, 삭제 기능 구현

PhoneInfo.java

public class PhoneInfo { //상태 : 이름, 전화번호, 생년월일 //기능 : 1인 전화내역 출력기능, private String name; private String phoneNo; private String birth; public PhoneInfo() {} public PhoneInfo(String name, String phoneNo, String birth) { this.name = name; this.phoneNo = phoneNo; this.birth = birth; } public void show() { System.out.println(“이름 : ” + name); System.out.println(“전화번호 : ” + phoneNo); System.out.println(“생년월일 : ” + birth); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhoneNo() { return phoneNo; } public void setPhoneNo(String phoneNo) { this.phoneNo = phoneNo; } public String getBirth() { return birth; } public void setBirth(String birth) { this.birth = birth; } }

멤버변수, 생성자, set/get 메서드

출력과 검색에 사용할 show() 메서드

Manager.java

import java.util.Scanner; public class Manager { PhoneInfo arr[]; Scanner sc = new Scanner(System.in); private String name = “”; private int count = 0; public Manager() { arr = new PhoneInfo[10]; // 객체생성과 동시에 배열 초기화 } public void addPhoneInfor() { // 이름, 전화번호, 생년월일 입력 System.out.println(“이름 : “); String name = sc.nextLine(); System.out.println(“전화번호 : “); String phoneNo = sc.nextLine(); System.out.println(“생년월일 : “); String birth = sc.nextLine(); // PhoneInfo 객체 생성 // 배열에 추가 => 객체가 생성될 때마다 count 증가 arr[count++] = new PhoneInfo(name, phoneNo, birth); } public void listPhoneInfo() { // 배열에 있는 모든 PhoneInfo 객체를 출력 // 현재 배열 안에 객체의 개수인 count만큼 for문을 수행. for (int i = 0; i < count; i++) { arr[i].show(); } } public void searchPhoneInfo() { // 이름을 기준으로 검색 System.out.println("이름 : "); String name = sc.nextLine(); int idx = -1; for (int i = 0; i < count; i++) { PhoneInfo info = arr[i]; if (name.equals(info.getName())) { info.show(); idx = i; } } if (idx == -1) { System.out.println("찾을 수 없습니다."); } } public void updatePhoneInfo() { System.out.println("이름 : "); String name = sc.nextLine(); int idx = -1; for (int i = 0; i < count; i++) { PhoneInfo info = arr[i]; if (name.equals(info.getName())) { System.out.println("수정 전화번호 입력 : "); String phoneNo = sc.nextLine(); info.setPhoneNo(phoneNo); System.out.println("수정 생년월일 입력 : "); String birth = sc.nextLine(); info.setBirth(birth); idx = i; break; } } } public void deletePhoneInfo() { System.out.println("이름 : "); String name = sc.nextLine(); int idx = -1; for (int i = 0; i < count; i++) { PhoneInfo info = arr[i]; if (name.equals(info.getName())) { idx = i; } } for(int i = idx; i < count -1; i++) { arr[i] = arr[i + 1]; } count = count -1; } } 객체를 담을 배열 선언 및 생성 배열 안에 객체의 수를 파악하기 위해 count 변수를 선언 addPhoneInfo()에서 PhoneInfo 객체가 생성될 때마다 count가 1씩 증가한다. (count++) deletePhoneInfo() 삭제할 객체의 인덱스 위치를 구하고 뒤에 있는 인덱스를 하나씩 앞으로 밀어준다. deletePhoneInfo() 마지막으로 배열 안에 객체의 수를 맞춰주기 위해 count-1 PhoneInfoMain.java import java.util.Scanner; public class PhoneInfoMain { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Manager m = new Manager(); while (true) { System.out.println("1.추가 2.출력 3.검색 4.수정 5.삭제 6.종료"); System.out.println("선택 : "); String menu = sc.nextLine(); switch (menu) { case "1": m.addPhoneInfor(); break; case "2": m.listPhoneInfo(); break; case "3": m.searchPhoneInfo(); break; case "4": m.updatePhoneInfo(); break; case "5": m.deletePhoneInfo(); case "6": System.out.println("프로그램 종료"); return; } } } }

coderbear’s log

728×90

# Chapter 6 : 객체지향 프로그래밍 1

Q1. 다음과 같은 멤버변수를 갖는 SutdaCard클래스를 정의하시오.

타입 변수명 설명 int num 카드의 숫자

(1~10 사이의 정수) boolean isKwang 광(光)이면 true

아니면 false

A.

class SutdaCard { int num; boolean isKwang; }

Q2. 문제 Q1에서 정의한 SutdaCard클래스에 두 개의 생성자와 info()를 추가해서

실행결과와 같은 결과를 얻도록 하시오.

class Exercise6_2 { public static void main(String args[]) { SutdaCard card1 = new SutdaCard(3, false); SutdaCard card2 = new SutdaCard(); System.out.println(card1.info()); System.out.println(card2.info()); } } class SutdaCard { /* (1) 알맞은 코드를 넣어 완성하시오. */ }

[ 실행결과 ]

31

K

A.

public class Snippet { boolean isKwang; SutdaCard() { this(1, true); // SutdaCard(1, true)를 호출한다. } SutdaCard(int num, boolean isKwang) { this.num = num; this.isKwang = isKwang; } String info() { // 숫자를 문자열로 반환한다. 광(光)인 경우 K를 덧붙인다. return num + ( isKwang? “K” : “”); } }

객체를 생성할 때 두 개의 생성자를 사용했으므로 두 개의 생성자를 정의해야한다.

SutdaCard card1 = new SutdaCard(3, false); // 3 SutdaCard card2 = new SutdaCard(); // 1K

일단 매개변수가 있는 생성자를 살펴보면, 카드의 num과 isKwang의 값을 매개변수로 받는 것을 알 수 있다.

그리고 매개변수가 없는 기본 생성자는 실행결과에서 “1K”가 출력된 것으로 봐서

num과 isKwang의 값을 각각 1과 true로 하였다는 것을 알 수 있다.

매개변수가 없는 기본 생성자를 정의할 때,

왼쪽의 코드와 같이 할 수도 있지만 오른쪽 코드와 같이 기존의 코드를 호출하는 것이 더 좋은 코드이다.

재사용성이 더 높고 나중에 코드를 수정할 때도 유리하다.

info()메서드는 card인스턴스의 정보를 문자열로 반환하기 위한 것이다.

card인스턴스의 멤버변수 num와 isKwang의 값을 문자열로 만들어서 반환하면 된다.

isKwang의 값이 true인 경우에는 숫자 뒤에 “K”를 붙이도록 삼항연산자를 사용했다.

String info() { // 숫자를 문자열로 반환한다. 광(光)인 경우 K를 덧붙인다. return num + ( isKwang? “K” : “”); }

변수 num은 타입이 int이지만 문자열과 덧셈연산을 하기 때문에 최종적으로는 문자열을 반환하게 된다.

Q3. 다음과 같은 멤버변수를 갖는 Student클래스를 정의하시오.

타입 변수명 설명 String name 학생이름 int ban 반 int no 번호 int kor 국어점수 int eng 영어점수 int math 수학점수

A.

class Student { String name; int ban; int no; int kor; int eng; int math; }

Q4. 문제6-3에서 정의한 Student클래스에

다음과 같이 정의된 두 개의 메서드 getTotal()과 getAverage()를 추가하시오.

① 메서드명 : getTotal

기 능 : 국어(kor), 영어(eng), 수학(math)의 점수를 모두 더해서 반환한다.

반환타입 : int

매개변수 : 없음

② 메서드명 : getAverage

기 능 : 총점(국어점수+영어점수+수학점수)을 과목수로 나눈 평균을 구한다.

소수점 둘째자리에서 반올림할 것.

반환타입 : float

매개변수 : 없음

class Exercise6_4 { public static void main(String args[]) { Student s = new Student(); s.name = “홍길동”; s.ban = 1; s.no = 1; s.kor = 100; s.eng = 60; s.math = 76; System.out.println(“이름:”+s.name); System.out.println(“총점:”+s.getTotal()); System.out.println(“평균:”+s.getAverage()); } } class Student { /* (1) 알맞은 코드를 넣어 완성하시오. */ }

[ 실행결과 ]

이름:홍길동

총점:236

평균:78.7

A.

class Student { String name; int ban; int no; int kor; int eng; int math; int getTotal() { return kor + eng + math; } float getAverage() { return (int)(getTotal() / 3f * 10 + 0.5f) / 10f; } } }

총점과 평균을 구하는 문제인데,

평균을 구할 때 소수점 둘째 자리에서 반올림을 하는 부분에서 생각을 좀 해야 할 것이다.

총점의 타입이 int이기 때문에 3으로 나누면 int와 int간의 연산이므로 결과를 int로 얻는다.

즉, 소수점 이하의 값은 버려지게 된다.

그래서 float타입의 리터럴인 3f로 나누어야 소수점 이하의 값들을 얻을 수 있다.

그리고, 소수점 둘째 자리에서 반올림하려면 10을 곱하고 0.5를 더한 다음 다시 10f로 나누면 된다.

236 / 3 → 78 236 / 3f → 78.666664 236 / 3f * 10 → 786.66664 236 / 3f * 10 + 0.5 → 787.16664 (int)(236 / 3f * 10 + 0.5) → (int)787.16664 → 787 (int)(236 / 3f * 10 + 0.5) / 10 → 78 (int)(236 / 3f * 10 + 0.5) / 10f → 78.7

Q5. 다음과 같은 실행결과를 얻도록 Student클래스에 생성자와 info()를 추가하시오.

class Exercise6_5 { public static void main(String args[]) { Student s = new Student(“홍길동”,1,1,100,60,76); System.out.println(s.info()); } } class Student { /* (1) 알맞은 코드를 넣어 완성하시오. */ }

[ 실행결과 ]

홍길동,1,1,100,60,76,236,78.7

A.

String name; int ban; int no; int kor; int eng; int math; Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; } int getTotal() { return kor+eng+math; } float getAverage() { return (int)(getTotal() / 3f * 10 + 0.5f) / 10f; } public String info() { return name +”,”+ban +”,”+no +”,”+kor +”,”+eng +”,”+math +”,”+getTotal() +”,”+getAverage() ; }

학생의 이름, 반, 번호, 과목별 성적을 매개변수로 받는 생성자를 추가하고,

학생의 정보를 출력하는 info()메서드를 정의하는 문제이다.

Q6. 두 점의 거리를 계산하는 getDistance()를 완성하시오.

[Hint] 제곱근 계산은 Math.sqrt(double a)를 사용하면 된다.

class Exercise6_6 { // 두 점 (x,y)와 (x1,y1)간의 거리를 구한다. static double getDistance(int x, int y, int x1, int y1) { /* (1) 알맞은 코드를 넣어 완성하시오. */ } public static void main(String args[]) { System.out.println(getDistance(1,1,2,2)); } }

[ 실행결과 ]

1.4142135623730951

A.

return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));

두 점 (x, y)와 (x1, y1)의 거리를 구하는 공식은 아래와 같다.

제곱근 계산은 Math클래스의 sqrt(double a)를 사용하면 된다.

제곱도 Math.pow(double a, double b)를 사용하면 되지만, 2제곱이므로 그냥 곱셈연산자를 사용했다.

어느 쪽을 사용해도 괜찮지만, 메서드를 호출하는 것은 곱셈연산보다 비용이 많이 드는 작업이라는 것은 기억해두자.

그렇다고 해서 보다 빠른 코드를 만들겠다고 코드를 복잡하게 하는 것은 좋지 않다.

참고로 Math.pow(double a, double b)를 사용한 코드는 다음과 같다.

static double getDistance(int x, int y, int x1, int y1) { return Math.sqrt(Math.pow(x-x1,2) + Math.pow(y-y1,2)); }

Q7. 문제6-6에서 작성한 클래스메서드 getDistance()를 MyPoint클래스의 인스턴스 메서드로 정의하시오.

class MyPoint { int x; int y; MyPoint(int x, int y) { this.x = x; this.y = y; } /* (1) 인스턴스메서드 getDistance를 작성하시오. */ } class Exercise6_7 { public static void main(String args[]) { MyPoint p = new MyPoint(1,1); // p와 (2,2)의 거리를 구한다. System.out.println(p.getDistance(2,2)); } }

[ 실행결과 ]

1.4142135623730951

A.

double getDistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); }

이전 문제의 static메서드를 인스턴스 메서드로 변경하는 문제인데,

static메서드와 인스턴스 메서드의 차이를 이해하는 것은 매우 중요하다.

static메서드인 경우에는 메서드 내에서 인스턴스 변수를 사용하지 않았다.

대신 매개변수(지역변수)로 작업에 필요한 값을 제공받아야했다.

그래서, 인스턴스와 관계가 없으므로(인스턴스변수를 사용 안했으니까) static메서드로 선언할 수 있는 것이다.

static double getDistance(int x, int y, int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); // x, y는 지역변수 }

그러나, 인스턴스 메서드는 인스턴스 변수 x, y를 사용해서 작업하므로 매개변수로 x1과 y1만을 제공받으면 된다.

인스턴스와 관계가 있으므로(인스턴스 변수를 사용했으니까) static을 붙일 수 없다.

double getDistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));// x, y는 인스턴스 변수 }

아래의 코드는 인스턴스 메서드를 사용할 때와 static메서드를 사용할 때의 차이를 보여주기 위한 것이다.

어떤 차이가 있는지 잘 살펴보자.

① static메서드의 사용

System.out.println(Exercise6_6.getDistance(1,1,2,2));

② 인스턴스 메서드의 사용

MyPoint p = new MyPoint(1,1); System.out.println(p.getDistance(2,2));

MyPoint클래스에 두 점간의 거리를 계산하는 메서드 getDistance()를 넣는다면,

static메서드 보다는 인스턴스메서드로 정의하는 것이 더 적합하다.

Q8. 다음의 코드에 정의된 변수들을 종류별로 구분해서 적으시오.

class PlayingCard { int kind; int num; static int width; static int height; PlayingCard(int k, int n) { kind = k; num = n; } public static void main(String args[]) { PlayingCard card = new PlayingCard(1,1); } }

A.

– 클래스변수(static변수) : width, height

– 인스턴스변수 : kind, num

– 지역변수 : k, n, card, args

변수가 선언된 위치를 보면 변수의 종류를 알 수 있다.

클래스 블럭{}내에 선언된 변수는 인스턴스 변수이고, static이 붙은 것은 static변수(클래스 변수)이다.

그리고 나머지는 모두 지역변수이다.

Q9. 다음은 컴퓨터 게임의 병사(marine)를 클래스로 정의한 것이다.

이 클래스의 멤버 중에 static을 붙여야 하는 것은 어떤 것들이고 그 이유는 무엇인가?

(단, 모든 병사의 공격력과 방어력은 같아야 한다.)

class Marine { int x=0, y=0; // Marine의 위치좌표(x,y) int hp = 60; // 현재 체력 int weapon = 6; // 공격력 int armor = 0; // 방어력 void weaponUp() { weapon++; } void armorUp() { armor++; } void move(int x, int y) { this.x = x; this.y = y; } }

A.

weapon, armor – 모든 Marine인스턴스에 대해 동일한 값이어야 하므로

weaponUp(), armorUp() – static변수에 대한 작업을 하는 메서드이므로

인스턴스마다 개별적인 값을 가져야하는 변수는 인스턴스변수로,

모든 인스턴스가 공통적인 값을 가져야하는 변수는 클래스 변수(static변수)로 선언해야한다.

그래서 위의 코드에서 어떤 변수들이 모든 인스턴스에서 공통적인 적인 값을 가져야하는지 알아내야한다.

병사(marin)의 위치는 모든 병사가 서로 다른 위치에 있어야 하므로 개별적인 값이어야 하고,

병사들마다 부상의 정도가 다를 것이므로 병사들의 체력(hp) 역시 개별적인 값이어야 한다.

그러나 모든 병사들의 공격력과 방어력은 같아야 한다.(게임이니까)

그래서 공격력을 의미하는 변수 weapon과 방어력을 의미하는 변수 armor에 static을 붙어야한다.

그 다음은 메서드인데, 어떤 메서드에 static을 붙이고 어떤 메서드에는 static을 붙이지 않아야하는 것일까?

메서드는 어떠한 작업을 하는 것인데, 이 작업을 할 때 인스턴스변수를 사용하면 인스턴스 메서드로 하고,

그렇지 않으면 static메서드로 하면 된다.

보통 인스턴스메서드는 인스턴스변수와 관련된 작업을 하고,

static메서드는 static변수와 관련된 작업을 하기 때문이다.

메서드 weaponUp()과 armorUp()은

각각 static변수 weapon과 armor를 가지고 작업을 하기 때문에 static을 붙이는 것이 맞다.

반면에 메서드 move(int x, int y)는 인스턴스변수 x와 y를 가지고 작업하기 때문에 static을 붙여서는 안 된다.

Q10. 다음 중 생성자에 대한 설명으로 옳지 않은 것은? (모두 고르시오.)

① 모든 생성자의 이름은 클래스의 이름과 동일해야한다.

② 생성자는 객체를 생성하기 위한 것이다.

③ 클래스에는 생성자가 반드시 하나 이상 있어야 한다.

④ 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다.

⑤ 생성자는 오버로딩 할 수 없다.

A.

② 생성자는 객체를 생성하기 위한 것이다.

생성자가 객체를 생성할 때 사용되기는 하지만, 객체를 초기화할 목적으로 사용되는 것이다.

객체를 생성하는 것은 new연산자이다.

⑤ 생성자는 오버로딩 할 수 없다.

생성자도 오버로딩이 가능해서 하나의 클래스에 여러 개의 생성자를 정의할 수 있다.

Q11. 다음 중 this에 대한 설명으로 맞지 않은 것은? (모두 고르시오.)

① 객체 자신을 가리키는 참조변수이다.

② 클래스 내에서라면 어디서든 사용할 수 있다.

③ 지역변수와 인스턴스변수를 구별할 때 사용한다.

④ 클래스 메서드 내에서는 사용할 수 없다.

A.

② 클래스 내에서라면 어디서든 사용할 수 있다.

클래스 멤버(static이 붙은 변수나 메서드)에는 사용할 수 없다.

this는 인스턴스 자신의 주소를 저장하고 있으며, 모든 인스턴스메서드에 숨겨진 채로 존재하는 지역변수이다.

그래서 인스턴스메서드 내에서만 사용할 수 있다.

Q12. 다음 중 오버로딩이 성립하기 위한 조건이 아닌 것은? (모두 고르시오.)

① 메서드의 이름이 같아야 한다.

② 매개변수의 개수나 타입이 달라야 한다.

③ 리턴타입이 달라야 한다.

④ 매개변수의 이름이 달라야 한다.

A.

③ 리턴타입이 달라야 한다.

리턴타입은 오버로딩에 영향을 주지 못한다.

④ 매개변수의 이름이 달라야 한다.

리턴타입은 오버로딩에 영향을 주지 못한다.

오버로딩의 조건 1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

(리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

Q13. 다음 중 아래의 add메서드를 올바르게 오버로딩 한 것은? (모두 고르시오.)

long add(int a, int b) { return a+b;}

① long add(int x, int y) { return x+y;}

② long add(long a, long b) { return a+b;}

③ int add(byte a, byte b) { return a+b;}

④ int add(long a, int b) { return (int)(a+b);}

A. ②, ③, ④

②, ③, ④는 모두 메서드의 이름이 add이고 매개변수의 타입이 다르므로 오버로딩이 성립한다.

오버로딩이 성립하기 위한 조건은 위에서 언급한 것을 확인하자.

Q14. 다음 중 초기화에 대한 설명으로 옳지 않은 것은? (모두 고르시오.)

① 멤버변수는 자동 초기화되므로 초기화하지 않고도 값을 참조할 수 있다.

② 지역변수는 사용하기 전에 반드시 초기화해야 한다.

③ 초기화 블럭보다 생성자가 먼저 수행된다.

④ 명시적 초기화를 제일 우선적으로 고려해야 한다.

⑤ 클래스변수보다 인스턴스변수가 먼저 초기화된다.

A. ③, ⑤

클래스변수는 클래스가 처음 메모리에 로딩될 때,

자동 초기화되므로 인스턴스 변수보다 먼저 초기화 된다.

그리고 생성자는 초기화 블럭이 수행된 다음에 수행된다.

Q15. 다음 중 인스턴스변수의 초기화 순서가 올바른 것은?

① 기본값-명시적초기화-초기화블럭-생성자

② 기본값-명시적초기화-생성자-초기화블럭

③ 기본값-초기화블럭-명시적초기화-생성자

④ 기본값-초기화블럭-생성자-명시적초기화

A. ①

변수의 초기화 순서는 다음과 같다.

변수의 초기화 순서 클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.

인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.

클래스변수의 초기화순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭

인스턴스변수의 초기화순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자

Q16. 다음 중 지역변수에 대한 설명으로 옳지 않은 것은? (모두 고르시오.)

① 자동 초기화되므로 별도의 초기화가 필요없다.

② 지역변수가 선언된 메서드가 종료되면 지역변수도 함께 소멸된다.

③ 매서드의 매개변수로 선언된 변수도 지역변수이다.

④ 클래스변수나 인스턴스변수보다 메모리 부담이 적다.

⑤ 힙(heap)영역에 생성되며 가비지 컬렉터에 의해 소멸된다.

A. ①, ⑤

지역변수는 자동 초기화 되지 않기 때문에 사용하기 전에 반드시 적절한 값으로 초기화를 해주어야한다.

지역변수는 자신이 선언된 블럭이나 메서드가 종료되면 소멸되므로 메모리 부담이 적다.

힙(heap)영역에는 인스턴스(인스턴스변수)가 생성되는 영역이며,

지역변수는 호출스택(call stack)에 생성된다.

Q17. 호출스택이 다음과 같은 상황일 때 옳지 않은 설명은? (모두 고르시오.)

① 제일 먼저 호출스택에 저장된 것은 main메서드이다.

② println메서드를 제외한 나머지 메서드들은 모두 종료된 상태이다.

③ method2메서드를 호출한 것은 main메서드이다.

④ println메서드가 종료되면 method1메서드가 수행을 재개한다.

⑤ main-method2-method1-println의 순서로 호출되었다.

⑥ 현재 실행중인 메서드는 println 뿐이다.

A. ②

호출스택의 제일 위에 있는 메서드가 현재 수행중인 메서드이며,

호출스택 안의 나머지 메서드들은 대기상태이다.

Q18. 다음의 코드를 컴파일하면 에러가 발생한다.

컴파일 에러가 발생하는 라인과 그 이유를 설명하시오.

class MemberCall { int iv = 10; static int cv = 20; int iv2 = cv; static int cv2 = iv; // 라인 A static void staticMethod1() { System.out.println(cv); System.out.println(iv); // 라인 B } void instanceMethod1() { System.out.println(cv); System.out.println(iv); // 라인 C } static void staticMethod2() { staticMethod1(); instanceMethod1(); // 라인 D } void instanceMethod2() { staticMethod1(); // 라인 E instanceMethod1(); } }

A. 라인 A, 라인 B, 라인 D

라인 A – static변수의 초기화에 인스턴스변수를 사용할 수 없다.

꼭 사용해야한다면, 객체를 생성해야한다.

라인 B – static메서드에서는 인스턴스변수를 사용할 수 없다.

라인 D – static메서드에서는 인스턴스메서드를 사용할 수 없다.

Q19. 다음 코드의 실행 결과를 예측하여 적으시오.

class Exercise6_19 { public static void change(String str) { str += “456”; } public static void main(String[] args) { String str = “ABC123”; System.out.println(str); change(str); System.out.println(“After change:”+str); } }

A.

[ 실행결과 ]

ABC123

After change:ABC123

change메서드의 매개변수가 참조형인데도 왜?

main메서드의 문자열 str에 변경한 내용이 반영되지 않은 것일까?

많은 사람들이 매개변수가 참조형이라는 것만 보고 main메서드의 문자열 str이 변경될 것이라고 쉽게 생각한다.

누구라도 실수하기 쉬운 부분이므로 주의하길 바라는 마음에서 이 문제를 만들었다.

그림과 함께 단계 별로 설명하면 어렵지 않게 이해할 수 있을 것이다.

처음에 문자열을 참조변수 str에 저장하면 아래와 같은 그림이 된다.

String str = “ABC123”;

그 다음에 메서드 change를 호출하면서 참조변수 str을 넘겨주면,

메서드 change의 지역변수 str에 주소값 0x100이 저장된다.

이제 메서드 change의 지역변수 str도 문자열 “ABC123″을 참조하게 된다.

이 두 참조변수는 이름은 같지만 분명히 다른 변수 이다.

서로 다른 영역에 존재하기 때문에 이름이 같아도 상관없는 것이다.

change(str); // change를 호출하면서 문자열 str을 넘겨준다.

메서드 change에서는 넘겨받은 문자열의 뒤에 “456”을 붙인다.

문자열은 내용을 변경할 수 없기 때문에 덧셈연산을 하면 새로운 문자열이 생성되고

새로운 문자열의 주소가 변수 str에 저장된다.

public static void change(String str) { str += “456”; // 기존의 문자열에 “456”을 붙인다. }

이제 change메서드는 종료되고,

작업에 사용하던 메모리를 반환하므로 change메서드의 지역변수인 str역시 메모리에서 제거된다.

다시 main메서드로 돌아와서 문자열 str의 값을 출력하면 처음의 값과 변함없는 값이 출력된다.

문자열 “ABC123456″은 참조하는 변수가 하나도 없으므로

적절한 시기에 가비지컬렉터(garbage collector)에 의해 제거된다.

System.out.println(“After change:”+str);

Q20. 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

[주의] Math.random()을 사용하는 경우 실행결과와 다를 수 있음.

메서드명 : shuffle

기 능 : 주어진 배열에 담긴 값의 위치를 바꾸는 작업을 반복하여 뒤섞이게 한다.

처리한 배열을 반환한다.

반환타입 : int[]

매개변수 : int[] arr – 정수값이 담긴 배열

class Exercise6_20 { /* (1) shuffle메서드를 작성하시오. */ public static void main(String[] args) { int[] original = {1,2,3,4,5,6,7,8,9}; System.out.println(java.util.Arrays.toString(original)); int[] result = shuffle(original); System.out.println(java.util.Arrays.toString(result)); } }

[ 실행결과 ] [1, 2, 3, 4, 5, 6, 7, 8, 9] [4, 6, 8, 3, 2, 9, 7, 1, 5]

A.

public static int[] shuffle(int[] arr) { if(arr==null || arr.length==0) return arr; for(int i=0; i< arr.length;i++) { int j = (int)(Math.random()*arr.length); // arr[i]와 arr[j]의 값을 서로 바꾼다. int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } return arr; } int배열을 매개변수로 받아서 배열에 저장된 각 요소들의 위치를 여러번 바꿔서 섞은 다음 반환하는 메서드이다. 매개변수로 어떤 값이 넘어올지 모르기 때문에 작업을 시작하기 전에 값의 유효성체크는 반드시 해야 한다. 아래의 코드는 넘겨받은 배열이 null이거나 크기가 0이면 그대로 반환한다. if(arr==null || arr.length==0) return arr; 반복문을 이용해서 반복적으로 배열의 임의의 두 요소의 값을 바꾼다. for(int i=0; i< arr.length;i++) { int j = (int)(Math.random()*arr.length); // arr[i]와 arr[j]의 값을 서로 바꾼다. int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } Math.random()을 사용하는 방법이나 두 변수의 값을 바꾸는 것에 대한 설명은 이전 문제들에서 했으므로 생략하겠다. Q21. TV클래스를 주어진 로직대로 완성하시오. 완성한 후에 실행해서 주어진 실행결과와 일치하는지 확인하라. [참고] 코드를 단순히 하기 위해서 유효성검사는 로직에서 제외했다. class MyTV { boolean isPowerOn; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; void turnOnOff() { // (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다. } void volumeUp() { // (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1증가시킨다. } void volumeDown() { // (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1감소시킨다. } void channelUp() { // (4) channel의 값을 1증가시킨다. // 만일 channel이 MAX_CHANNEL이면, channel의 값을 MIN_CHANNEL로 바꾼다. } void channelDown() { // (5) channel의 값을 1감소시킨다. // 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX_CHANNEL로 바꾼다. } } // class MyTV class Exercise6_21 { public static void main(String args[]) { MyTv t = new MyTv(); t.channel = 100; t.volume = 0; System.out.println("CH:"+t.channel+", VOL:"+ t.volume); t.channelDown(); t.volumeDown(); System.out.println("CH:"+t.channel+", VOL:"+ t.volume); t.volume = 100; t.channelUp(); t.volumeUp(); System.out.println("CH:"+t.channel+", VOL:"+ t.volume); } } [ 실행결과 ] CH:100, VOL:0 CH:99, VOL:0 CH:100, VOL:100 A. class MyTV { boolean isPowerOn; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; void turnOnOff() { // (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다. isPowerOn = !isPowerOn; } void volumeUp() { // (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1증가시킨다. if(volume < MAX_VOLUME) volume++; } void volumeDown() { // (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1감소시킨다. if(volume > MIN_VOLUME) volume–; } void channelUp() { // (4) channel의 값을 1증가시킨다. // 만일 channel이 MAX_CHANNEL이면, channel의 값을 MIN_CHANNEL로 바꾼다. if(channel==MAX_CHANNEL) { channel = MIN_CHANNEL; } else { channel++; } } void channelDown() { // (5) channel의 값을 1감소시킨다. // 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX_CHANNEL로 바꾼다. if(channel==MIN_CHANNEL) { channel = MAX_CHANNEL; } else { channel–; } } } // class MyTV class Exercise6_21 { public static void main(String args[]) { MyTv t = new MyTv(); t.volume = 0; System.out.println(“CH:”+t.channel+”, VOL:”+ t.volume); t.channelDown(); t.volumeDown(); System.out.println(“CH:”+t.channel+”, VOL:”+ t.volume); t.volume = 100; t.channelUp(); t.volumeUp(); System.out.println(“CH:”+t.channel+”, VOL:”+ t.volume); } }

Q22. 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

메서드명 : isNumber

기 능 : 주어진 문자열이 모두 숫자로만 이루어져있는지 확인한다.

모두 숫자로만 이루어져 있으면 true를 반환하고,

그렇지 않으면 false를 반환한다.

만일 주어진 문자열이 null이거나 빈문자열“”이라면 false를 반환한다.

반환타입 : boolean

매개변수 : String str – 검사할 문자열

[Hint] String클래스의 charAt(int i)메서드를 사용하면 문자열의 i번째 위치한 문자를 얻을 수 있다.

class Exercise6_22 { /* (1) isNumber메서드를 작성하시오. */ public static void main(String[] args) { String str = “123”; System.out.println(str+”는 숫자입니까? “+isNumber(str)); str = “1234o”; System.out.println(str+”는 숫자입니까? “+isNumber(str)); } }

[ 실행결과 ]

123는 숫자입니까? true

1234o는 숫자입니까? false

A.

public static boolean isNumber(String str) { if(str==null || str.equals(“”)) return false; for(int i=0; i< str.length();i++) { char ch = str.charAt(i); if(ch < '0' || ch > ‘9’) { return false; } } // for return true; }

매개변수로 어떤 값이 넘어올지 모르기 때문에

값의 작업을 시작하기 전에 유효성체크는 반드시 해야 한다.

아래의 코드는 넘겨받은 문자열(str)이 null이거나 빈 문자열 (“”)이면 false를 반환한다.

if(str==null || str.equals(“”)) return false;

반복문과 charAt(int i)을 이용해서 문자열에서 한 문자씩 차례대로 읽어와 char타입의 변수 ch에 저장한다.

for(int i=0; i< str.length();i++) { char ch = str.charAt(i); 읽어온 문자(ch)가 숫자가 아니면 false를 반환한다. if(ch < '0' || ch > ‘9’) { // if(!(‘0’<=ch && ch<='9'))와 같다. return false; } Q23. 다음과 같이 정의된 메서드를 작성하고 테스트하시오. 메서드명 : max 기 능 : 주어진 int형 배열의 값 중에서 제일 큰 값을 반환한다. 만일 주어진 배열이 null이거나 크기가 0인 경우, -999999를 반환한다. 반환타입 : int 매개변수 : int[] arr - 최대값을 구할 배열 class Exercise6_23{ /* (1) max메서드를 작성하시오. */ public static void main(String[] args) { int[] data = {3,2,9,4,7}; System.out.println(java.util.Arrays.toString(data)); System.out.println("최대값:"+max(data)); System.out.println("최대값:"+max(null)); System.out.println("최대값:"+max(new int[]{})); // 크기가 0인 배열 } } [ 실행결과 ] [3, 2, 9, 4, 7] 최대값:9 최대값:-999999 최대값:-999999 A. public static int max(int[] arr) { if(arr==null || arr.length==0) return -999999; int max = arr[0]; // 배열의 첫 번째 값으로 최대값을 초기화 한다. for(int i=1; i< arr.length;i++) { // 배열의 두 번째 값부터 비교한다. if(arr[i] > max) max = arr[i]; } return max; }

매개변수로 넘겨받은 배열 arr이 null이거나 크기가 0이면 -999999을 반환한다.

if(arr==null || arr.length==0) return -999999;

배열의 첫 번째 요소(arr[0])로 최대값(max)을 초기화 한다.

int max = arr[0]; // 배열의 첫 번째 값으로 최대값을 초기화 한다.

최대값 max를 배열의 첫 번째 값으로 초기화 했으므로 첫 번째값은 비교할 필요가 없다.

그래서 두 번째 값(arr[1])부터 비교한다. 비교해서 최대값보다 크면 그 값을 변수 max에 저장한다.

for(int i=1; i< arr.length;i++) { // 배열의 두 번째 값부터 비교한다. if(arr[i] > max) // 배열의 i번 째 요소가 max보다 크면 max = arr[i]; }

반복문을 다 돌고 나면, max에는 배열의 요소 중 가장 큰 값이 저장되어 있을 것이다.

이 값을 반환한다.

return max;

Q24. 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

메서드명 : abs

기 능 : 주어진 값의 절대값을 반환한다.

반환타입 : int

매개변수 : int value

{ /* (1) abs메서드를 작성하시오. */ public static void main(String[] args) { int value = 5; System.out.println(value+”의 절대값:”+abs(value)); value = -10; System.out.println(value+”의 절대값:”+abs(value)); } }

[ 실행결과 ]

5의 절대값:5

-10의 절대값:10

A.

public static int abs(int value) { return value >=0 ? value : -value; }

value의 값이 양수이면 그대로 반환하고, 음수이면 부호를 바꿔서 반환하면 된다.

if문을 사용해도 되지만 삼항연산자를 이용하면 보다 간결한 코드를 얻을 수 있다.

참고로 if문을 사용한 코드는 다음과 같다.

public static int abs(int value) { if(value >=0) { return value; } else { return -value; // value가 음수인 경우, 부호를 변경한다. } }

[참고자료] Java의 정석 3rd Edition / 남궁성 / https://cafe.naver.com/javachobostudy

728×90

키워드에 대한 정보 자바 객체 지향 연습 문제

다음은 Bing에서 자바 객체 지향 연습 문제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [자바 기초 26] 연습문제: 객체지향

  • 자바
  • 프로그래밍
  • 입문
  • 실습
  • 연습
  • 문제
  • 객체지향
  • OOP
  • 자바 객체지향 프로그래밍
  • 자바 static 메소드
  • 자바 클래스 구현
  • 자바 객체 생성
  • 자바 생성자
  • 자바 클래스 메소드
[자바 #기초 #26] #연습문제: #객체지향


YouTube에서 자바 객체 지향 연습 문제 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [자바 기초 26] 연습문제: 객체지향 | 자바 객체 지향 연습 문제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  서울 의 밤 소주 | 매실 증류 25도 소주가 그렇게 부드럽다그래서 사봤습니다! 서울의 밤 마셔봅시다! 16286 투표 이 답변

Leave a Reply

Your email address will not be published. Required fields are marked *