용어정리
본문정리
객체 지향과 자바
특성은 3가지 캡슐화, 상속, 다형성가 있다.
캡슐화는 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것이다. 리모콘은 버튼만 보이고 내부는 보질 못한다. 자바에선 클래스라는 캡슐을 사용하며, 필드(멤버 변수)와 메소드(멤버 함수)로 구성된다.
상속은 하위 개체가 상위 개체의 속성을 모두 가지는 관계이다. 자바에선 확장(extends)하는 개념으로 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하는 것이며, 부모 클래스는 슈퍼 클래스라고 부르며 자식 클래스는 서브 클래스이다.
다형성은 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것이다. 오버라이딩이란 슈퍼 클래스에 구현된 메소드를 서브 클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 것이다. 오버로딩은 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러 개 만드는 것이다.
객체 지향 언어의 목적은 소프트웨어의 재사용(객체, 캡슐화, 상속, 다형성 등)과 실세계에 적합이다.
자바 클래스 만들기
클래스란 객체를 만들어 내기 위한 설계도 혹은 틀이며 객체는 클래스 모양 그대로 생성된 실체이다. 객체를 클래스의 인스턴스라고도 부른다. 객체마다 속성들의 값은 서로 다르다.
클래스 선언, class ~ : 자바 클래스는 class 키워드를 사용하며 멤버는 필드(멤버 변수)와 메소드(멤버 함수)의 두 가지이다. 클래스 외부에는 어떤 필드나 메소드를 둘 수 없다. 캡슐화의 원칙 때문이다.
필드와 메소드 : 객체 내에 값을 저장할 멤버 변수를 필드라 부른다. 메소드는 함수이며 객체의 행동을 구현한다.
접근 지정자 : public은 다른 클래스에서 활용하거나 접근할 수 있음을 선언한다. 접근 지정자를 생략할 때 디폴트 접근이라 부른다.
생성자 : 클래스의 이름과 동일한 메소드를 생성자라 한다. 생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메소드이다.
래퍼런스 변수 선언 : 객체를 생성하기 전, 객체를 가르킬 레퍼런스 변수를 먼저 선언한다. 선언시 NULL로 초기화 된다. 객체를 생성하기 위해 new 연산자를 사용한다. 객체가 생성될 때는 1) 해당 타입 크기의 메모리 할당을 하고 2) 생성자 코드를 실행한다. 여기서 중요한건 생성자 코드를 실행했다는 것이다. 이는 생성자를 만들어야 한다는 의미와 같다.(마지막 문장 이게 맞나? 내가 해석한게 맞겠지?)
생성자
생성자는 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드이다. 생성자는 객체가 생성되는 순간에 자동으로 호출되는 메소드이다. 이하는 생성자의 특징이다.
생성자의 이름은 클래스 이름과 동일하다.
생성자는 여러 개 작성 할 수 있다.
생성자는 new를 통해 객체를 생성할 때 한 번만 호출된다.
생성자에 리턴 타입을 지정할 수 없다.
생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다.
기본 생성자란 매개변수와 실행 코드가 없어 아무 일도 하지 않고 단순 리턴하는 생성자이다. 디폴트 생성자라고도 불린다.
기본 생성자가 자동으로 생성되는 경우 : 생성자가 없는 클래스는 있을 수 없다(오 내가 해석한게 맞아!!) 그러므로 생성자가 없다면, 컴파일러는 기본 생성자를 자동으로 생성한다.(아니네 내가 해석한건 이게 아닌데)
기본 생성자가 자동으로 생성되지 않는 경우 : 생성자가 하나라도 존재하는 클래스에는 컴파일러가 기본 생성자를 삽입해 주지 않는다.
this는 현재 현재 실행되고 있는 메소드가 속한 객체에 대한 레퍼런스이다. 음 c언어로 생각해 보았는데 함수에서 매개변수를 받을 때 , 해당 매개변수 이름을 함수에서 다르게 받을 수 있다. 자바에서도 바꿀 수 있는데 해당 클래스에서 변경한 변수 이름과 클래스에서 선언한 변수 이름과 같다면 변경하지 못한다. 이때 클래스에서 선언한 변수 이름에 this를 붙이는 것이다. 또한 래퍼런스임을 기억해야한다.
이하는 사용시 주의할 점이다.
생성자 코드에서만 호출할 수 있다.
같은 클래스 내 다른 생성자를 호출할 때 사용된다.
생성자의 첫 번재 문장이 되어야 한다.
객체 배열
자바의 객체 배열은 객체에 대한 레퍼런스를 원소로 갖는 배열이다.
래퍼런스 선언을 할 때는 클래스명 [] 변수명을 입력해야한다. 즉 배열의 크기를 입력하면 안된다. 래퍼런스를 생성하는 것이기 때문이다.
래퍼런스 배열 생성 또한 마찬가지로 래퍼런스를 생성하는 것이다. 즉 객체를 아직 만들지 않았다.
c = new Circle[5];
객체 생성은 객체를 생성하여 배열의 각 레퍼런스에 대입하는 것이다.
c[i] = new Circle[i];
메소드 활용
메소드 형식은 다음과 같다. "접근지정자 리턴타입 메소드이름(메소드 인자들)"
자바는 값에 의한 호출을 이용한다.
매개변수에 기본 타입의 겂이 전달되는 경우는 call by value이지만
매개변수에 객체가 전달되는 경우는 call by reference이며
매개변수에 배열이 전달되는 경우는 call by reference이다.
메소드 오버로딩은 메소드 중복이라고도 하며 한 클래스 내에, 이름이 같지만 매개변수의 타입이나 개수가 서로 다른 여러 개의 메소드를 중복 작성할 수 있다. 메소드의 리턴 타입이나 접근 지정자는 메소드 오버로딩과 관련없다.
객체의 소멸과 가비지 컬렉션
객체 소멸이란 new에 의해 생성된 객체 공간을 자바 가상기계에게 돌려주어 가용 메모리에 포함 시키는 것이다.
가비지란 자바 응용프로그램에서 더 이상 사용되지 않게 된 객체나 배열 메모리이다. 참조하는 레퍼런스가 하나도 없는 객체나 배열을 가비지로 판단한다. 가용 메모리가 일정 크기 이하로 줄어들면 자동으로 가비지를 회수하여 가용 메모리를 늘리는데 이를 가비지 컬렉션이라 하며 가비지 컬렉션 스레드에 의해 처리된다. System.gc()가 가비지 컬렉션을 강제로 요청한다.
접근 지정자
패키지란 서로 관련 있는 클래스 파일들을 의미한다.자바의 접근 지정자에는 private, protected, public, 접근 지정자 생략이 있다.
이하는 클래스 접근 지정이다.
public은 패키지에 상관없이 다른 어떤 클래스에서도 허용된다.
default는 같은 패키지 내의 클래스들에게만 사용이 허용된다. 디폴트 클래스는 다른 패키지의 접근이 불허된다.
이하는 멤버 접근 지정이다.
private → 디폴트 접근 지정 → protected → public순으로 공개 범위가 넓어진다.
public 멤버는 패키지를 막론하고 모든 클래스들이 접근 가능하다.
private 멤버는 클래스 내의 멤버들에게만 접근이 허용된다.
protected 멤버는 같은 패키지의 모든 클래스 접근과 자식 클래스의 경우 접근이 허용된다.
디폴트 접근 지정 멤버는 동일한 패키지 내에 있는 클래스들만 디폴트 멤버를 자유롭게 접근할 수 있다.
private | 디폴트 접근 지정 | protected | public | |
같은 패키지의 클래스 | X | 0 | 0 | 0 |
다른 패키지의 클래스 | X | X | X | 0 |
접근 가능 영역 | 클래스 내 | 동일한 패키지 내 | 동일한 패키지와 자식 클래스 |
모든 클래스 |
static 멤버
static 멤버는 클래스당 하나씩 생긴다고 해서 클래스 멤버라고도 부르며, non-static 멤버는 각 개체마다 하나씩 생긴다고 해서 인스턴스 멤버라고 부른다. static은 동일한 클래스의 모든 객체들에 의해 공유된다. 코드 실행되는 시점에 이미 static은 존재한다.
호출하는 방법은 객체.static필드 or 클래스명.static멤버가 있다.
static 메소드는 static 멤버만 접근할 수 있고 this를 사용할 수 없다.
final
클래스에 쓰인 경우 : 클래스를 상속받을 수 없음을 지정한다.
매소드로 쓰인 경우 : 오버라이딩할 수 없는 메소드임을 선언한다.
필드로 쓰인 경우 : 상수가 된다.
연습문제
p178. Q1. 자바의 객체 지향 개념에 포함되는 것은?
상속, 캡슐화, 다형성
Q2. 캡슐화, 상속, 다형성 중에서 코드의 재사용과 가장 관계 깊은 객체 지향 특성은?
상속
Q3. 다음 예는 어떤 객체 지향 특성과 관계있는가?
1) 메뚜기는 생물이다. 객체
2) TV는 튼튼한 플라스틱의 외형 때문에 내부 회로는 안전하다. 상속
3) 볼펜,연필은 쓰는 도구이지만, 쓰는 방법이 각기 다르다. 다형성
p198 Q1. 다음 코드에서 잘못된 부분이 3군데 있다. 모두 수정하라.
class Samp{
int id;
public void Samp(int x){
this.id = x;
}
public void Samp(){
System.out.println("생성자 호출");
this(0);
}
}
1. class Samp → public class Samp
2. 맨 마지막 this(0)을 한칸 위로 옮겨야 한다.
3. 생성자에 void 붙이면 안된다.
Q2. 다음 코드는 오류를 포함하고 있다. 이유를 설명하고 올바르게 수정하라.
class ConstructorExample{
int x;
public void setX(int x) { this.x = x;}
public int getX() {return x;}
public ConstructorExample(int x){
ConstructorExample a = new ConstructorExample();
int n = a.getX();
}
}
ConstructorExample a = new ConstructorExample()에선 자동으로 생성자를 생성하지 못한다. 따라서 ()안에 int 값을 넣어야 한다.
Q3. this와 this()의 차이를 설명하라.
this는 현재 객체 자신에 대한 레퍼런스다. this()는 클래스 내에서 생성자가 다른 생성자를 호출 할때 사용하는 코드이다.
p204. Q1. String 타입의 name, int 타입의 age, double 타입의 height, weight 등 네 개의 필드를 갖는 Human 클래스를 작성하라. 생성자를 작성하여 String 타입의 이름을 전달받아 멤버 name에 저장하라.
Q2. 문제 1에 main() 메소드를 추가하여 레퍼런스 변수명을 aHuman으로 하고 Human 객체를 생성한 후 name 필드를 "홍길동"으로 age는 21, height는 180.5, weight는 각 73.2를 각각 대입하라.
Q3. 배열의 크기가 5인 Human 타입의 객체 배열을 생성하라.
package fqwf;
class Human{
String name;
int age;
double height, weight;
public Human() {}
public Human(String name) {
this.name = name;
}
public Human(String name, int age, double height, double weight) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
}
public class qwf {
public static void main(String[] args) {
Human aHuman = new Human("홍길동", 21, 180.5, 73.2);
Human bHuman[] = new Human[5];
for(int i =0;i<5;i++) {
bHuman[i] = new Human();
}
}
}
p210. Q1. double 타입의 일차원 배열을 매개변수로 전달받아 배열의 합을 리턴하는 getSum() 메소드를 작성하라.
Q2. 메소드 오버로딩이 성공할 조건을 설명하라.
메소드이름이 동일하영야 한다.
매개변수의 개수나 타입이 서로 달라야 한다.
Q3. 메소드가 배열을 전달받는 경우 메소드 내에서 배열 원소의 값을 변경하면 원본 배열의 값이 변경되는가?
변경할 수 있다.
p214. Q1. 자바에서 가비지 컬렉션이 필요한 이유는 무엇인가? 가비지 컬렉션의 장단점은 무엇인가?
new에 의해 생성된 객체 공간을 자바 가상 기계에게 돌려주어 가용 메모리에 포함 시키기 위함이다. 단점은 갑자기 메모리가 부족한 경우 그 때부터 가비지 컬렉터를 실행하는데 이때 멈칫한다. 이에 실시간 처리 응용에 부적합하다.
Q4. 자바 플랫폼에게 가비지 컬렉션을 요청하는 코드를 한 줄로 작성하라.
System.gc();
p221 Q1. 다음 코드에서 SampleClass 클래스는 패키지 A에, AccessEx 클래스는 패키지 B에 저장된다고 할 때 코드에서 컴파일 오류를 찾아내고 이유를 설명하라.
해당 문제는 클래스에 public을 붙이지 않으면 다른 패키지에선 쓸 수 없다는 것을 보이기 위함이다.
Q2. 다음 코드에서 SampleClass 클래스와 FieldAccess 클래스는 같은 패키지에 저장된다고 할 때 코드에서 컴파일 오류를 찾아내고 이유를 설명하라.
private는 해당 클래스에서만 쓸 수 있다.
p231. Q1. static 멤버와 인스턴스 멤버 중 객체마다 생성되는 것은 어떤 것인가?
인스턴스 멤버
Q2. static 메소드에서 인스턴스 멤버를 접근할 수 없는 이유를 설명하라.
실행시키기 전에 이미 static은 생성되어 있지만, 인스턴스는 객체 생성시에 생성된다.
Q3. 다음 코드에서 잘못된 부분을 찾고 이유를 설명하시오.
static은 this를 사용하면 안된다는 것을 알려주는 문장
Q4. static 멤버 사용에 있어 아래 소스의 main에서 문법적으로 틀린 부분을 찾아내라.
static이 아닌 인스턴스는 실행시점에 없기때문에 사용이 불가능하다.
본문제
Q1. 자바 클래스와 객체에 대한 설명 중 맞는 것은?
클래스 바깥에 전역 변수는 선언할 수 없다.
클래스는 객체를 생성하기 위한 틀이다.
클래스의 맴버 변수를 필드라고 부르며, 클래스는 필드와 메소드로 이루어져있다.
필드는 클래스 내에서 private으로 선언하는게 바람직하다.
Q2. 생성자에 대한 설명 중 맞는 것은?
생성자가 작성되어 있지 않으면, 컴파일러가 자동으로 기본 생성자를 추가해준다.
생성자의 이름은 클랫의 이름과 반드시 같아야 한다.
this()는 생성자 내에서 다른 생성자를 호출하는 코드이다.
Q3. 오류가 없는 코드는?
Power[]p = new Power[10], Power p[] = new Power[10], Power [] p
Q4. 다음 코드에 대해 설명하는 문항 중 맞는 것은?
Book [] book = new Book[10];
book은 배열에 대한 레퍼런스이다.
for(int i = 0 ; i < 10; i++) book[i] = new Book();로 객체들을 만들어야 비로소 배열이 완성된다.
book[0], book[1] 등은 모두 Book 객체에 대한 레퍼런스이다.
Q5. 오버로딩에 성공한 사례는?
메소드 이름과 매개 변수 개수 및 타입이 모두 다르면 실폐함을 알려주는 문제
Q6. 다음 질문에 답하라.
class TV {
int size;
String manufacturer;
public TV() {
size = 32;
manufacturer = "LG";
System.out.println(size+"인치 "+manufacturer);
}
public TV(String manufacturer) {
this.size = 32;
this.manufacturer = manufacturer;
System.out.println(size+"인치 "+manufacturer);
}
public TV(int size, String manufacturer) {
this.size = size;
this.manufacturer = manufacturer;
System.out.println(size+"인치 "+manufacturer);
}
}
1) this를 이용하여 생성자를 수정하라.
첫 괄호 필드에 this를 붙이기
2) new TV(); 와 new TV("삼성");를 실행하면 실행 결과는 각각 무엇인가?
32인치 LG
32인치 삼성
3) 65인치 "삼성" TV 객체를 생성하는 코드를 적어라.
new TV(65, "삼성")
4) this()를 이용하는 장점은 무엇이가?
클래스 내에서 생성자가 다른 생성자를 호출 할때 사용하는 코드이다.
Q7. 다음 클래스에는 컴파일 오류가 있다. 오류 부분을 지적하고 오류를 수정할 수 있는 방법을 모두 제시하라. 그리고 그 중 객체 지향 프로그래밍에 가장 적합한 방법을 설명하라.
class Person {
private int age;
}
public class Example {
public static void main (String args[]) {
Person aPerson = new Person();
aPerson.age = 17;
}
}
class 문장 안의 private을 없애야한다.
Q8. 다음 코드를 객체 지향 프로그래밍 관점에서 바람직한 코드로 수정하라.
class Power {
public int kick;
public int punch;
}
public class Example {
public static void main (String args[]) {
Power robot = new Power();
robot.kick = 10;
robot.punch = 20;
}
}
이거 잘 모르겠다.
Q10. 다음 코드가 실행될 때 가비지가 발생하는가? 만일 발생한다면 발생하는 위치와 과정을 설명하라.
String s = null;
for(int n=0; n<10; n++) {
s = new String("Hello"+n);
System.out.println(s);
}
Hello0, Hello1 등 모두 가비지가 되고 Hello9만 남는다.
Q11. 다음 클래스에서 멤버 함수의 사용이 잘못된 것은?
class StaticTest {
static int a;
static int getA() { return a; } //(1)
int b;
int getB() { return b; } //(2)
int f() { return getA(); } //(3)
static int g() { return getB(); } //(4)
}
4번, static의 메소드 안에는 인스터스 변수가 들어가면 안된다.
Q12. 다음 코드에서 잘못된 문장은?
class StaticSample {
public int x;
public static int y;
public static int f() { return y; }
}
public class UsingStatic {
public static void main (String[] args) {
StaticSample.x = 5; //(1)
StaticSample.y = 10; //(2)
int tmp = StaticSample.f(); //(3)
StaticSample a = new StaticSample();
tmp = a.y; //(4)
}
}
1번, 아직 StaticSample을 가르키는 레퍼런스가 없다. 근데 인스턴스 변수에 해당 값을 넣었기 때문에 잘못되었다.
Q13. 다음 소스에 틀린 부분이 있는지 판단하라. 만일 있다면 수정하라.
class Test {
public int f(int a, int b) {
return a + b;
}
public static void main (String[] args) {
int sum = f(2,4);
}
}
main이 static으로 호출 되었기 때문에 static public 으로 호출해야 한다.
Q14. 다음 코드에는 final과 관련하여 3가지 잘못된 것이 있다. 잘못된 내용을 설명하라.
final class Rect {
final protected int x = 5;
final public void f() {
x++;
System.out.pring(x);
}
}
class SpecialRect extends Rect { // SpecialRect는 Rect를 상속받는다.
public void f() {
System.out.print(super.x); // super.x는 Rect의 x
}
}
1. SpecialRect는 Rect를 상속받을 수 없다. final이 클래스에 쓰이면 자식 클래스를 두지 않는다는 의미이다.
2. final 붙은 상수는 변경 될 수 없기 때문에 x++는 불가능하다.
3. super.x는 오버라이딩 되지 않는다.
밑의 풀이는 해당 티스토리를 참고했다.
https://security-nanglam.tistory.com/213
감사합니다!!
[명품 JAVA] 4장 실습문제 (클래스와 객체)
[공지] 코딩, 솔루션, 포스팅 주제 관련 [4장 1번] 자바 클래스를 작성하는 연습을 해보자. 다음 main() 메소드를 실행하였을 때 예시와 같이 출력되도록 TV 클래스를 작성하라. public static void main(Stri
security-nanglam.tistory.com
Q1. 자바 클래스를 작성하는 연습을 해보자. 다음 main() 메소드를 실행하였을 때 예시와 같이 출력되도록 TV 클래스를 작성하라.
public static void main(String[] args) {
TV myTV = new TV("LG", 2017, 32); //LG에서 만든 2017년 32인치
myTV.show();
}
LG에서 만든 2017년형 32인치 TV
class TV{
String name;
int year;
int inch;
public void show() {
System.out.print(this.name + "에서 만든 " + this.year+"년형 " + this.inch +"인치 TV");
}
public TV(String name, int year, int inch) {
this.name = name;
this.year = year;
this.inch = inch;
}
}
처음에 public static TV로 입력을 했는데 static이 안들어가면 안될까?
아! 밑에 변수가 인스턴스다!
Q2. Grade 클래스를 작성해보자. 3 과목의 점수를 입력받아 Grade 객체를 생성하고 성적 평균을 출력하는 main()과 실행 예시는 다음과 같다.
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.print("수학, 과학, 영어 순으로 3개의 정수 입력 >> ");
int math = sc.nextInt();
int science = sc.nextInt();
int english = sc.nextInt();
Grade me = new Grade(math, science, english);
System.out.println("평균은 "+me.average()); // average()는 평균을 계산하여 리턴
sc.close();
}
수학, 과학, 영어 순으로 3개의 정수 입력 >> 90 88 96
평균은 91
class Grade{
int math;
int science;
int english;
int average;
public Grade(int math, int science, int english) {
this.math = math; this.science = science; this.english = english;
}
public int average() {
average = (math + science + english) / 3;
return average;
}
}
Q3. 노래 한 곡을 나타내는 Song 클래스를 작성하라. Song은 다음 필드로 구성된다.
- 노래의 제목을 나타내는 title
- 가수를 나타내는 artist
- 노래가 발표된 연도를 나타내는 year
- 국적을 나타내는 country
또한 Song 클래스에 다음 생성자와 메소드를 작성하라.
- 생성자 2개: 기본 생성자와 매개변수로 모든 필드를 초기화하는 생성자
- 노래 정보를 출력하는 show() 메소드
- main() 메소드에서는 1978년, 스웨덴 국적의 ABBA가 부른 "Dancing Queen"을
song 객체로 생성하고 show()를 이용하여 노래의 정보를 다음과 같이 출력하라.
1978년 스웨덴국적의 ABBA가 부른 Dancing Queen
public class Song {
String title;
String name;
int year;
String country;
public void show() {
System.out.println(this.year +"년 " + this.country +"국적의 " + this.name+"가 부른 " + this.title);
}
public Song() { }
public Song(String title, String name, int year, String country) {
this.title = title;
this.name = name;
this.year = year;
this.country = country;
}
public static void main(String[] args) {
int year = 1978;
String country = "스웨덴";
String name = "ABBA";
String title = "Dancing Queen";
Song s = new Song(title, name, year, country);
s.show();
}
}
Q4. 다음 멤버를 가지고 직사각형을 표현하는 Rectangle 클래스를 작성하라.
- int 타입의 x, y, width, height 필드: 사각형을 구성하는 점과 크기 정보
- x, y, width, height 값을 매개변수로 받아 필드를 초기화하는 생성자
- int square() : 사각형 넓이 리턴
- void show() : 사각형의 좌표와 넓이를 화면에 출력
- boolean contatins(Rectangle r) : 매개변수로 받은 r이 현 사각형 안에 있으면 true 리턴
- main() 메소드의 코드와 실행 결과는 다음과 같다
public static void main(String[] args) {
Rectangle r = new Rectangle(2, 2, 8, 7);
Rectangle s = new Rectangle(5, 5, 6, 6);
Rectangle t = new Rectangle(1, 1, 10, 10);
r.show();
System.out.println("s의 면적은 "+s.square());
if(t.contains(r)) System.out.println("t는 r을 포함합니다.");
if(t.contains(s)) System.out.println("t는 s를 포함합니다.");
}
(2,2)에서 크기가 8x7인 사각형
s의 면적은 36
t는 r을 포함합니다.
class Rectangle{
int x, y, width, height;
public Rectangle(int x, int y, int width, int height) {
this.x = x; this.y = y; this.width = width; this.height = height;
}
public int square() {
return width * height;
}
public void show() {
System.out.println("("+ x + "," + y+") 에서 크기가 "+ width +"x"+height+"인 사각형");
}
public boolean contains(Rectangle r) {
if(x < r.x && y < r.y) {
if((x+width) > (r.x+r.width) && (y+height) >(r.y + r.height)) {
return true;
}
}
return false;
}
}
중간에 r.x + r.width를 r.x + width로 썼었다. 그리고 객체를 넣을 수 있음을 기억해야한다!
Q5. 다음 설명대로 Circle 클래스와 CircleManager 클래스를 완성하라.
import java.util.Scanner;
class Circle {
private double x, y;
private int radius;
public Circle(double x, double y, int radius) {
_______________________________; //x, y, radius 초기화
}
public void show() {
_______________________________
}
}
public class CircleManager {
public static void main(String[] args) {
Scanner sc = ___________________;
Circle c[] = ______________; // 3개의 Circle 배열 선언
for(int i=0; i < _______; i ++) {
System.out.print("x, y, radius >>");
______________________; // x값 읽기.
______________________; // y값 읽기.
_______________________; // radius값 읽기.
c[i] = ____________________; // Circle 객체 생성
}
for(int i=0; i<c.length; i++)
______________; // 모든 Circle 객체 출력
sc.close();
}
}
다음 실행 결과와 같이 3개의 Circle 객체 배열을 만들고 x, y, radius 값을 읽어 3개의 Circle 객체를 만들고 show()를 이용하여 이들을 모두 출력한다.
x, y, radius >>3.0 3.0 5
x, y, radius >>2.5 2.7 6
x, y, radius >>5.0 2.0 4
(3.0,3.0)5
(2.5,2.7)6
(5.0,2.0)4
import java.util.Scanner;
class Circle {
private double x, y;
private int radius;
public Circle(double x, double y, int radius) {
this.x = x; this.y = y; this.radius = radius; //x, y, radius 초기화
}
public void show() {
System.out.println("(" + x + "," + y +")"+radius);
}
}
public class angle {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Circle c[] = new Circle[3]; // 3개의 Circle 배열 선언
for(int i=0; i < c.length; i ++) {
System.out.print("x, y, radius >>");
double x = sc.nextDouble(); // x값 읽기.
double y = sc.nextDouble(); // y값 읽기.
int radius = sc.nextInt(); // radius값 읽기.
c[i] = new Circle(x,y,radius); // Circle 객체 생성
}
for(int i=0; i<c.length; i++)
c[i].show(); // 모든 Circle 객체 출력
sc.close();
}
}
Q6. 앞의 5번 문제는 정답이 공개되어 있다. 이 정답을 참고하여 Circle 클래스와 CircleManager 클래스를 수정하여 다음 실행 결과처럼 되게 하라.
x, y, radius >>3.0 3.0 5
x, y, radius >>2.5 2.7 6
x, y, radius >>5.0 2.0 4
가장 면적인 큰 원은 (2.5,2.7)6
public int rad() {
return radius;
}
//위 클래스에 해당 내용을 더했다.
Circle a = new Circle(0,0,0);
for(int i = 0 ; i < c.length - 1; i++) {
if(c[i].rad() > c[i+1].rad())
a = c[i];
}
System.out.print("가장 면적인 큰 원은 ");a.show();
//close 되기 전에 추가로 만들었다.
Q7. 하루의 할 일을 표현하는 클래스 Day는 다음과 같다. 한 달의 할 일을 표현하는 MonthSchedule 클래스를 작성하라.
class Day {
private String work; //하루의 할 일을 나타내는 문자열
public void set(String work) { this.work = work; }
public String get() { return work; }
public void show() {
if(work == null) System.out.println("없습니다.");
else System.out.println(work+"입니다.");
}
}
MonthSchedule 클래스에는 Day 객체 배열과 적절한 필드, 메소드를 작성하고 실행 예시처럼 입력, 보기, 끝내기 등의 3개의 기능을 작성하라.
이번달 스케쥴 관리 프로그램.
할일(입력:1, 보기:2, 끝내기:3) >>1
날짜(1~30)?1
할일(빈칸없이입력)?자바공부
할일(입력:1, 보기:2, 끝내기:3) >>2
날짜(1~30)?1
1일의 할 일은 자바공부입니다.
할일(입력:1, 보기:2, 끝내기:3) >>3
프로그램을 종료합니다.
public class MonthSchedule {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input;
int day;
String work;
Day d[] = new Day[31]; // 사람에게 맞추기위해 31까지로 설정
System.out.println("이번달 스케쥴 관리 프로그램.");
while(true) {
System.out.print("할일(입력:1, 보기:2, 끝내기:3) >>");
input = sc.nextInt();
if(input == 1) {
System.out.print("날짜(1~30)?");
day = sc.nextInt();
d[day] = new Day();
System.out.print("할일(빈칸없이입력)?");
work = sc.next();
d[day].set(work);
}
if(input == 2) {
System.out.print("날짜(1~30)?");
day = sc.nextInt();
System.out.print(day + "일의 할 일은 "); d[day].show();
}
if(input == 3) {
break;
}
}
System.out.println("프로그램을 종료합니다.");
}
}
Q8. 이름(name), 전화번호(tel) 필드와 생성자 등을 가진 Phone 클래스를 작성하고, 실행 예시와 같이 작동하는 PhonBook 클래스를 작성하라.
인원수 >> 3
이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>황기태 777-7777
이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>나명품 999-9999
이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>최자바 333-1234
저장되었습니다...
검색할 이름 >>황기순
황기순이 없습니다.
검색할 이름 >>최자바
최자바의 번호는 333-1234 입니다.
검색할 이름 >>그만
package qwer;
import java.util.Scanner;
class Phone{
String name;
String tel;
public Phone(String name, String tel) {
this.name = name;
this.tel = tel;
}
}
public class PhoneBook {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count;
String name, tel, input, output;
System.out.print("인원수>>");
count = sc.nextInt();
Phone a[] = new Phone[count];
for(int i = 0; i < count; i++) {
System.out.print("이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>");
name = sc.next();
tel = sc.next();
a[i] = new Phone(name, tel);
}
System.out.println("저장되었습니다...");
while(true) {
System.out.print("검색할 이름>>");
input = sc.next();
if(input.equals("그만")){
break;
}
else {
output = "이 없습니다.";
for(int i = 0; i <count; i++) {
if(input.equals(a[i].name)) {
output = a[i].tel + "입니다.";
}
}
System.out.println(input + output);
}
}
}
}
Q9. 다음 2개의 static 가진 ArrayUtil 클래스를 만들어보자. 다음 코드의 실행 결과를 참고하여 concat()와 print()를 작성하여 ArrayUtil 클래스를 완성하라.
class ArrayUtil {
public static int[] concat(int[] a, int[] b) {
/* 배열 a와 b를 연결한 새로운 배열 리턴 */
}
public static void print(int[] a) {/* 배열 a 출력 */}
}
public class StaticEx {
public static void main(String[] args) {
int[] array1 = {1, 5, 7, 9};
int[] array2 = {3, 6, -1, 100, 77};
int[] array3 = ArrayUtil.concat(array1, array2);
ArrayUtil.print(array3);
}
}
[ 1 5 7 9 3 6 -1 100 77 ]
class ArrayUtil {
public static int[] concat(int[] a, int[] b) {
int temp [] = new int [a.length + b.length];
for(int i = 0 ; i < a.length; i++)
temp[i] = a[i];
for(int i = a.length ; i < a.length + b.length; i++) {
temp[i] = b[i - a.length];
}
return temp;
}
public static void print(int[] a) {
for(int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
}
}
public class StaticEx {
public static void main(String[] args) {
int[] array1 = {1, 5, 7, 9};
int[] array2 = {3, 6, -1, 100, 77};
int[] array3 = ArrayUtil.concat(array1, array2);
ArrayUtil.print(array3);
}
}
Q10. 다음과 같은 Dictionary 클래스가 있다. 실행 결과와 같이 작동하도록 Dictionary 클래스의 kor2Eng() 메소드와 DicApp 클래스를 작성하라.
class Dictionary {
private static String[] kor = {"사랑", "아기", "돈", "미래", "희망"};
private static String[] eng = {"love", "baby", "money", "future","hope"};
public static String kor2Eng(String word) { /*검색 코드 작성*/ }
}
한영 단어 검색 프로그램입니다.
한글 단어?희망
희망은 hope
한글 단어?아가
아가는 저의 사전에 없습니다.
한글 단어?아기
아기는 baby
한글 단어?그만
package qwer;
import java.util.Scanner;
class Dictionary {
private static String[] kor = {"사랑", "아기", "돈", "미래", "희망"};
private static String[] eng = {"love", "baby", "money", "future","hope"};
public static String kor2Eng(String word) {
for(int i = 0; i < 5; i++) {
if(kor[i].equals(word))
return eng[i];
}
String a = "저의 사전에 없습니다.";
return a;
}
}
public class DicApp {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String name, output;
System.out.println("한영 단어 검색 프로그램입니다.");
while(true) {
System.out.print("한글 단어?");
name = sc.next();
if(name.equals("그만"))
break;
else {
System.out.println(name +"은 "+ Dictionary.kor2Eng(name));
}
}
}
}
Q11. 다수의 클래스를 만들고 활용하는 연습을 해보자. 더하기(+), 빼기(-), 곱하기(*), 나누기(/)를 수행하는 각 클래스 Add, Sub, Mul, Div를 만들어라. 이들은 모두 다음 필드와 메소드를 가진다.
- int 타입의 a, b 필드: 2개의 피연산자
- void setValue(itn a, int b): 피연사 값을 객체 내에 저장한다.
- int calculate(): 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.
main() 메소드에서는 다음 실행 사례와 같이 두 정수와 연산자를 입력받고 Add, Sub, Mul, Div 중에서 이 연산을 실행할 수 있는 객체를 생성하고 setValue()와 calculate()를 호출하여 결과를 출력하도록 작성하라. (참고: 이 문제는 상속을 이용하여 다시 작성하도록 5장의 실습문제로 이어진다.)
두 정수와 연산자를 입력하시오 >> 5 7 *
35
package qwer;
import java.util.Scanner;
class Add{
int a, b;
public Add(int a, int b) {
this.a = a; this.b = b;
System.out.print(a+b);
}
}
class Sub{
int a, b;
public Sub(int a, int b) {
this.a = a; this.b = b;
System.out.print(a-b);
}
}
class Mul{
int a, b;
public Mul(int a, int b) {
this.a = a; this.b = b;
System.out.print(a*b);
}
}
class Div{
int a, b;
public Div(int a, int b) {
this.a = a; this.b = b;
System.out.print(a/b);
}
}
public class calc {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a, b;
String c;
System.out.print("두 정수와 연산자를 입력하시오>>");
a = sc.nextInt();
b = sc.nextInt();
c = sc.next();
if(c.equals("+")) {
Add plus = new Add(a,b);
}
else if(c.equals("-")){
Sub minus = new Sub(a,b);
}
else if(c.equals("*")){
Mul muti = new Mul(a,b);
}
else if(c.equals("/")){
Div div = new Div(a,b);
}
}
}
Q12. 간단한 콘서트 예약 시스템을 만들어보자. 다수의 클래스를 다루고 객체의 배열을 다루기에는 아직 자바 프로그램 개발이 익숙하지 않은 초보자에게 다소 무리가 있을 것이다. 그러나 반드시 넘어야 할 산이다. 이 도전을 통해 산을 넘어갈 수 있는 체력을 키워보자. 예약 시스템의 기능은 다음과 같다.
- 공연은 하루에 한 번 있다.
- 좌석은 S석, A석, B석으로 나뉘며, 각각 10개의 좌석이 있다.
- 예약 시스템의 메뉴는 "예약", "조회", "취소", "끝내기"가 있다.
- 예약은 한 자리만 가능하고, 좌석 타입, 예약자 이름, 좌석 번호를 순서대로 입력받아 예약한다.
- 조회는 모든 좌석을 출력한다.
- 취소는 예약자의 이름을 입력받아 취소한다.
- 없는 이름, 없는 번호, 없는 메뉴, 잘못된 취소 등에 대해서 오류 메시지를 출력하고 사용자가 다시 시도하도록 한다.
명품콘서트홀 예약 시스템입니다.
예약:1, 조회:2, 취소:3, 끝내기:4 >> 1
좌석구분 S(1), A(2), B(3)>>1
S>> ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
이름>>황기태
번호>>1
예약:1, 조회:2, 취소:3, 끝내기:4 >> 1
좌석구분 S(1), A(2), B(3)>>2
A>> ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
이름>>김효수
번호>>5
예약:1, 조회:2, 취소:3, 끝내기:4 >> 2
S>> 황기태 ___ ___ ___ ___ ___ ___ ___ ___ ___
A>> ___ ___ ___ ___ 김효수 ___ ___ ___ ___ ___
B>> ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
<<<조회를 완료하였습니다.>>>
예약:1, 조회:2, 취소:3, 끝내기:4 >> 3
좌석 S:1, A:2, B:3>>2
A>> ___ ___ ___ ___ 김효수 ___ ___ ___ ___ ___
이름>>김효수
예약:1, 조회:2, 취소:3, 끝내기:4 >> 2
S>> 황기태 ___ ___ ___ ___ ___ ___ ___ ___ ___
A>> ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
B>> ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
<<<조회를 완료하였습니다.>>>
예약:1, 조회:2, 취소:3, 끝내기:4 >> 4
package subject2;
import java.util.Scanner;
class Name_S {
String name;
public Name_S(String name) {
this.name = name;
}
public String get_name() {
return this.name;
}
public void put_name(String name) {
this.name = name;
}
}
class Name_A {
String name;
public Name_A(String name) {
this.name = name;
}
public String get_name() {
return this.name;
}
public void put_name(String name) {
this.name = name;
}
}
class Name_B {
String name;
public Name_B(String name) {
this.name = name;
}
public String get_name() {
return this.name;
}
public void put_name(String name) {
this.name = name;
}
}
class S {
Name_S name[];
int i = 0;
public S() {
name = new Name_S[10];
for (i = 0; i < 10; i++) {
name[i] = new Name_S("---");
}
}
public void show() {
System.out.print("S>> ");
for (i = 0; i < 10; i++) {
System.out.print(name[i].get_name() + " ");
}
System.out.println();
}
public void reserve(String input_name, int num) {
name[num].put_name(input_name);
}
public void delete(String input_name) {
for(i = 0; i < 10; i++) {
if(name[i].get_name().equals(input_name)) {
break;
}
}
if (i == 10) {
System.out.println("찾는 이름이 없습니다.");
}
else {
name[i].put_name("---");
}
}
}
class A {
Name_A name[];
int i = 0;
public A() {
name = new Name_A[10];
for (i = 0; i < 10; i++) {
name[i] = new Name_A("---");
}
}
public void show() {
System.out.print("A>> ");
for (i = 0; i < 10; i++) {
System.out.print(name[i].get_name() + " ");
}
System.out.println();
}
public void reserve(String input_name, int num) {
name[num].put_name(input_name);
}
public void delete(String input_name) {
for(i = 0; i < 10; i++) {
if(name[i].get_name().equals(input_name)) {
break;
}
}
if (i == 10) {
System.out.println("찾는 이름이 없습니다.");
}
else {
name[i].put_name("---");
}
}
}
class B {
Name_B name[];
int i = 0;
public B() {
name = new Name_B[10];
for (i = 0; i < 10; i++) {
name[i] = new Name_B("---");
}
}
public void show() {
System.out.print("B>> ");
for (i = 0; i < 10; i++) {
System.out.print(name[i].get_name() + " ");
}
System.out.println();
}
public void reserve(String input_name, int num) {
name[num].put_name(input_name);
}
public void delete(String input_name) {
for(i = 0; i < 10; i++) {
if(name[i].get_name().equals(input_name)) {
break;
}
}
if (i == 10) {
System.out.println("찾는 이름이 없습니다.");
}
else {
name[i].put_name("---");
}
}
}
public class problem {
public static void main(String []args) {
Scanner sc = new Scanner(System.in);
S sit_s = new S();
A sit_a = new A();
B sit_b = new B();
while (true) {
System.out.print("예약 : 1, 조회 : 2, 취소 : 3, 끝내기 : 4>>");
int command = sc.nextInt();
if (command == 4) {
break;
}
else if (command == 1) {
System.out.print("좌석구분 S(1), A(2), B(3)>>");
int sit_en = sc.nextInt();
if (sit_en == 1) {
sit_s.show();
System.out.print("이름>>");
String name = sc.next();
System.out.print("번호>>");
int num = sc.nextInt();
sit_s.reserve(name, num - 1);
}
else if (sit_en == 2) {
sit_a.show();
System.out.print("이름>>");
String name = sc.next();
System.out.print("번호>>");
int num = sc.nextInt();
sit_a.reserve(name, num - 1);
}
else if (sit_en == 3) {
sit_b.show();
System.out.print("이름>>");
String name = sc.next();
System.out.print("번호>>");
int num = sc.nextInt();
sit_b.reserve(name, num - 1);
}
}
else if (command == 2) {
sit_s.show();
sit_a.show();
sit_b.show();
System.out.println("<<조회를 완료하였습니다>>");
}
else if (command == 3) {
System.out.print("좌석구분 S(1), A(2), B(3)>>");
int sit_en = sc.nextInt();
if (sit_en == 1) {
sit_s.show();
System.out.print("이름>>");
String name = sc.next();
sit_s.delete(name);
}
else if (sit_en == 2) {
sit_a.show();
System.out.print("이름>>");
String name = sc.next();
sit_a.delete(name);
}
else if (sit_en == 3) {
sit_b.show();
System.out.print("이름>>");
String name = sc.next();
sit_b.delete(name);
}
}
}
}
}
'java > 학교,기관' 카테고리의 다른 글
모듈과 패키지 개념, 자바 기본 패키지(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.11.10 |
---|---|
상속(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.10.22 |
반복문과 배열 그리고 예외 처리(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.10.09 |
자바 기본 프로그래밍(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.10.08 |
자바 시작(프로그래밍 심화)(명품 JAVA Programming ) (0) | 2022.10.03 |
댓글