[6-1] 다음과 같은 멤버변수를 갖는 SutdaCard클래스를 정의하시오.
타입
|
변수명
|
설 명
|
int
|
num
|
카드의 숫자.(1-10사이의 정수)
|
boolean
|
isKwang
|
광이면 true, 아니면 false
|
답:
class SutdaCard {
int num;
boolean isKwang;
}
[6-2] 문제 1에서 정의한 SutdaCard클래스에 두 개의 생성자와 info()를 추가해서
실행결과와 같은 결과를 얻도록 하시오.
3
1K
답:
public 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 {
// 멤버변수
int num;
boolean isKwang;
// 파라미터 없는 생성자
public SutdaCard() {
this.num = 1;
this.isKwang = true;
}
// 파라미터 있는 생성자
public SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
// 메서드
public String info() {
if (isKwang) {
return num + "K";
} else {
return String.valueOf(num);
}
}
}
풀이
// 멤버 변수 정의
int num;
boolean isKwang;
// 기본 생성자 수정
public SutdaCard() {
this.num = 1;
this.isKwang = true;
}
// num을 1로, isKwang을 true로 초기화
// 파라미터 있는 생성자
public SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
// num과 isKwang을 파라미터로 받아 초기화
// 정보를 반환하는 info 메서드
public String info() {
if (isKwang) {
return num + "K";
} else {
return String.valueOf(num);
}
}
// isKwang이 true이면 숫자 뒤에 "K"를 붙여 반환
// isKwang이 false이면 숫자만 문자열로 반환
[6-3] 다음과 같은 멤버변수를 갖는 Student클래스를 정의하시오.
타입
|
변수명
|
설명
|
String
|
name
|
학생이름
|
int
|
ban
|
반
|
int
|
no
|
번호
|
int
|
kor
|
국어점수
|
int
|
eng
|
영어점수
|
int
|
math
|
수학점수
|
답:
class Student {
/**
* 학생이름
*/
String name;
/**
* 반
*/
int ban;
/**
* 번호
*/
int no;
/**
* 국어점수
*/
int kor;
/**
* 영어점수
*/
int eng;
/**
* 수학점수
*/
int math;
}
[6-4] 문제6-3에서 정의한 Student클래스에 다음과 같이 정의된 두 개의 메서드 getTotal()과 getAverage()를 추가하시오.
① 메서드명 : getTotal
기 능 : 국어(kor), 영어(eng), 수학(math)의 점수를 모두 더해서 반환한다.
반환타입 : int
매개변수 : 없음
② 메서드명 : getAverage
기 능 : 총점(국어점수+영어점수+수학점수)을 과목수로 나눈 평균을 구한다.
소수점 둘째자리에서 반올림할 것.
반환타입 : float
매개변수 : 없음
답:
public 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 {
/**
* 학생이름
*/
String name;
/**
* 반
*/
int ban;
/**
* 번호
*/
int no;
/**
* 국어점수
*/
int kor;
/**
* 영어점수
*/
int eng;
/**
* 수학점수
*/
int math;
/**
* @return
* 국어, 영어, 수학의 점수의 총합
*/
public int getTotal() {
return kor+eng+math;
};
/**
* @return
* 총점/과목수 한 전과목 평균
*/
public float getAverage() {
return (int)(getTotal() / 3f * 10 + 0.5f) / 10f;
}
}
풀이
//Student 클래스
name: 학생 이름을 저장하는 문자열 변수.
ban: 반 번호를 저장하는 정수형 변수.
no: 학생 번호를 저장하는 정수형 변수.
kor, eng, math: 각각 국어, 영어, 수학 점수를 저장하는 정수형 변수.
// getTotal 메서드
public int getTotal() {
return kor + eng + math;
}
//국어, 영어, 수학 점수를 합산하여 총점을 반환.
//getAverage 메서드
public float getAverage() {
return (int)(getTotal() / 3f * 10 + 0.5f) / 10f;
}
//총점을 과목 수로 나누어 평균을 계산.
//(int)(getTotal() / 3f * 10 + 0.5f) / 10f 로 반올림 처리.
//반올림 처리 설명
// getTotal() / 3f : 총점을 3.0으로 나누어 실수 형태로 평균 계산.
// * 10: 소수점 둘째 자리까지 계산하기 위해 10을 곱함.
// + 0.5f: 반올림을 위해 0.5를 더함.
// (int): 소수점 이하를 버림으로써 반올림 효과를 얻음.
// / 10f: 다시 10으로 나누어 소수점 둘째 자리까지 표현.
[6-5] 다음과 같은 실행결과를 얻도록 Student클래스에 생성자와 info()를 추가하시오.
홍길동,1,1,100,60,76,236,78.7
답:
public 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 {
/**
* 학생이름
*/
String name;
/**
* 반
*/
int ban;
/**
* 번호
*/
int no;
/**
* 국어점수
*/
int kor;
/**
* 영어점수
*/
int eng;
/**
* 수학점수
*/
int math;
public 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;
}
/**
* @return 국어, 영어, 수학의 점수의 총합
*/
public int getTotal() {
return kor + eng + math;
}
;
/**
* @return 총점/과목수 한 전과목 평균
*/
public float getAverage() {
return (int) (getTotal() / 3f * 10 + 0.5f) / 10f;
}
/**
* @return 정보반환
*/
public String info() {
return
name + ',' +
ban + ',' +
no + ',' +
kor + ',' +
eng + ',' +
math + ',' +
getTotal() + ',' +
getAverage();
}
}
[6-6] 두 점의 거리를 계산하는 getDistance()를 완성하시오.
[Hint] 제곱근 계산은 Math.sqrt(double a)를 사용하면 된다.
답:
public class Exercise6_6 {
// 두 점 (x,y)와 (x1,y1)간의 거리를 구한다.
static double getDistance(int x, int y, int x1, int y1) {
return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));
}
public static void main(String args[]) {
System.out.println(getDistance(1,1,2,2));
}
}
풀이
// getDistance 메서드 정의
static double getDistance(int x, int y, int x1, int y1) {
return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));
}
//이 메서드는 두 점 (x, y)와 (x1, y1) 사이의 거리를 계산하여 반환.
// 피타고라스 정리를 사용하여 두 점 사이의 거리를 계산:
// (x - x1)*(x - x1): x 좌표 간의 차이를 제곱
//(y - y1)*(y - y1): y 좌표 간의 차이를 제곱
// 두 제곱을 더한 값을 Math.sqrt를 사용하여 제곱근을 구함
// main 메서드에서 getDistance 호출
public static void main(String args[]) {
System.out.println(getDistance(1,1,2,2));
}
/*
main 메서드는 프로그램의 진입점.
getDistance(1, 1, 2, 2)를 호출하여 점 (1, 1)과 점 (2, 2) 사이의 거리를 계산하고, 그 결과를 출력.
getDistance 메서드가 반환하는 값을 System.out.println을 사용하여 출력.
*/
참고 :
1. 피타고라스 정리를 사용한 두 점 사이의 거리 계산식
사진 설명을 입력하세요.
2. Math.sqrt : 자바의 제곱근 함수
[6-7] 문제6-6에서 작성한 클래스메서드 getDistance()를 MyPoint클래스의 인스턴스 메서드로 정의하시오.
답:
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));
}
}
class MyPoint {
int x;
int y;
MyPoint(int x, int y) {
this.x = x;
this.y = y;
}
// 빵틀 만들기
public double getDistance(int x1, int y1) {
MyPoint myPoint = new MyPoint(x,y);
return Math.sqrt((myPoint.x-x1)*(myPoint.x-x1) + (myPoint.y-y1)*(myPoint.y-y1));
}
}
풀이
이전의 static 메서드를 instance 메서드로 변경하는 문제.
정적 메서드 (static method):
클래스 레벨에서 호출, 객체 상태와 무관한 동작.
인스턴스 메서드 (Instance method):
객체 레벨에서 호출, 객체 상태와 관련된 동작.
이 예제에서는 getDistance가 인스턴스 메서드로 정의되어 있어, MyPoint 객체의 상태에 따라 동작. static 메서드로 정의하면 x와 y 인스턴스 변수를 직접 사용할 수 없고, 객체의 상태에 종속되지 않는 동작을 정의하는 데 적합.
출처 입력
[6-8] 다음의 코드에 정의된 변수들을 종류별로 구분해서 적으시오.
public class Exercise6_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
[6-9] 다음은 컴퓨터 게임의 병사(marine)를 클래스로 정의한 것이다.
이 클래스의 멤버 중에 static을 붙여야 하는 것은 어떤 것들이고 그 이유는 무엇인가?
(단, 모든 병사의 공격력과 방어력은 같아야 한다.)
public class Exercise6_9 {
public static void main(String args[]) {
PlayingCard card = new PlayingCard(1, 1);
}
}
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;
}
}
답:
병사의 공격력과 방어력이 같아야 하므로 관련된 변수와 메서드에 static을 붙여야 함.
weapon, armor, weaponUp(), armorUp()
[6-10] 다음 중 생성자에 대한 설명으로 옳지 않은 것은? (모두 고르시오.)
① 모든 생성자의 이름은 클래스의 이름과 동일해야한다.
② 생성자는 객체를 생성하기 위한 것이다.
③ 클래스에는 생성자가 반드시 하나 이상 있어야 한다.
④ 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다.
⑤ 생성자는 오버로딩 할 수 없다.
답:
2,3,5
풀이
1. 모든 생성자의 이름은 클래스의 이름과 동일해야 한다.
옳음. 생성자의 이름은 클래스의 이름과 동일해야 함.
2. 생성자는 객체를 생성하기 위한 것이다.
틀림. 생성자는 객체를 생성하기 위한 것이 아니라, 객체가 생성될 때 호출되어 초기화를 수행하기 위한 것임. 객체 생성은 new 연산자가 담당.
3. 클래스에는 생성자가 반드시 하나 이상 있어야 한다.
틀림. 클래스에 생성자가 명시적으로 없으면 컴파일러가 기본 생성자(파라미터가 없는 생성자)를 자동으로 추가.
4. 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다.
옳음. 클래스에 생성자가 하나도 정의되어 있지 않으면 컴파일러가 자동으로 기본 생성자를 추가.
5. 생성자는 오버로딩 할 수 없다.
틀림. 생성자는 오버로딩 할 수 있음. 즉, 같은 이름의 생성자를 여러 개 정의할 수 있으며, 각 생성자는 서로 다른 파라미터 리스트를 가짐.
[6-11] 다음 중 this에 대한 설명으로 맞지 않은 것은? (모두 고르시오.)
① 객체 자신을 가리키는 참조변수이다.
② 클래스 내에서라면 어디서든 사용할 수 있다.
③ 지역변수와 인스턴스변수를 구별할 때 사용한다.
④ 클래스 메서드 내에서는 사용할 수 없다.
답:
2
풀이
2. 클래스 내에서라면 어디서든 사용할 수 있다.
this는 인스턴스 메서드와 생성자 내에서만 사용 가능. 클래스 메서드(정적 메서드) 내에서는 사용할 수 없음. 클래스 메서드는 인스턴스와 무관하게 호출되므로 this 참조가 존재하지 않음.
[6-12] 다음 중 오버로딩이 성립하기 위한 조건이 아닌 것은? (모두 고르시오.)
① 메서드의 이름이 같아야 한다.
② 매개변수의 개수나 타입이 달라야 한다.
③ 리턴타입이 달라야 한다.
④ 매개변수의 이름이 달라야 한다.
답:
3,4
풀이
3. 리턴타입이 달라야 한다.
오버로딩은 메서드의 시그니처(메서드 이름 + 매개변수의 개수, 타입, 순서)로 결정됨. 리턴타입이 달라도 매개변수가 동일하면 오버로딩이 성립하지 않음.
4. 매개변수의 이름이 달라야 한다.
오버로딩은 매개변수의 이름이 아닌 매개변수의 타입, 개수, 순서로 결정됨. 따라서 매개변수의 이름은 오버로딩과 무관함.
[6-13] 다음 중 아래의 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);}
답:
2,3,4
[6-14] 다음 중 초기화에 대한 설명으로 옳지 않은 것은? (모두 고르시오.)
① 멤버변수는 자동 초기화되므로 초기화하지 않고도 값을 참조할 수 있다.
② 지역변수는 사용하기 전에 반드시 초기화해야 한다.
③ 초기화 블럭보다 생성자가 먼저 수행된다.
④ 명시적 초기화를 제일 우선적으로 고려해야 한다.
⑤ 클래스변수보다 인스턴스변수가 먼저 초기화된다.
답:
3,5
풀이
3. 초기화 블럭보다 생성자가 먼저 수행된다.
틀림. 초기화 블럭은 생성자가 호출되기 전에 실행됨. 초기화 블럭은 클래스가 로드될 때(클래스 초기화 블럭) 또는 인스턴스가 생성될 때(인스턴스 초기화 블럭) 실행됨.
5. 클래스변수보다 인스턴스변수가 먼저 초기화된다.
틀림. 클래스변수는 클래스가 메모리에 로드될 때 초기화됨. 반면, 인스턴스변수는 객체가 생성될 때 초기화됨. 따라서 클래스변수가 인스턴스변수보다 먼저 초기화됨.
[6-15] 다음 중 인스턴스변수의 초기화 순서가 올바른 것은?
① 기본값-명시적초기화-초기화블럭-생성자
② 기본값-명시적초기화-생성자-초기화블럭
③ 기본값-초기화블럭-명시적초기화-생성자
④ 기본값-초기화블럭-생성자-명시적초기화
답:
1
참고
[변수 초기화 순서]
클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.
인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.
클래스변수의 초기화순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭
인스턴스변수의 초기화순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자
[6-16] 다음 중 지역변수에 대한 설명으로 옳지 않은 것은? (모두 고르시오.)
① 자동 초기화되므로 별도의 초기화가 필요없다.
② 지역변수가 선언된 메서드가 종료되면 지역변수도 함께 소멸된다.
③ 매서드의 매개변수로 선언된 변수도 지역변수이다.
④ 클래스변수나 인스턴스변수보다 메모리 부담이 적다.
⑤ 힙(heap)영역에 생성되며 가비지 컬렉터에 의해 소멸된다.
답:
1,5
풀이
1. 자동 초기화되므로 별도의 초기화가 필요없다.
틀림. 지역변수는 자동으로 초기화되지 않음. 사용하기 전에 반드시 초기화해야 함. 초기화되지 않은 지역변수를 사용하려고 하면 컴파일 에러가 발생.
5. 힙(heap)영역에 생성되며 가비지 컬렉터에 의해 소멸된다.
틀림. 지역변수는 스택(stack) 영역에 생성됨. 메서드 호출 시 스택 프레임에 할당되고, 메서드가 종료되면 스택에서 제거되어 소멸됨. 힙(heap) 영역에 생성되는 것은 인스턴스 변수와 배열, 객체 등. 가비지 컬렉터는 힙 영역의 객체를 관리.
[6-17] 호출스택이 다음과 같은 상황일 때 옳지 않은 설명은? (모두 고르시오.)
사진 설명을 입력하세요.
① 제일 먼저 호출스택에 저장된 것은 main메서드이다.
② println메서드를 제외한 나머지 메서드들은 모두 종료된 상태이다.
③ method2메서드를 호출한 것은 main메서드이다.
④ println메서드가 종료되면 method1메서드가 수행을 재개한다.
⑤ main-method2-method1-println의 순서로 호출되었다.
⑥ 현재 실행중인 메서드는 println 뿐이다.
답:
2
풀이
호출스택의 제일 위에 있는 메서드가 현재 수행중인 메서드이며,
호출스택 안의 나머지 메서드들은 대기상태이다.
[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 변수의 초기화에 인스턴스 변수를 사용할 수 없다.
- 라인C
- 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
풀이
문자열의 불변성(Immutable)
Java에서 문자열(String) 객체는 불변(immutable) 객체로 설계됨.
문자열이 생성되면 그 내용을 변경할 수 없음.
str += "456"; 구문은 str에 "456"을 추가한 새로운 문자열을 생성하고, str 참조 변수를 새 문자열로 변경하지만, 이 변경은 change 메서드 내에서만 유효함.
값에 의한 호출 (Pass-by-Value)
Java에서 메서드 호출 시 인자는 값에 의한 호출로 전달됨.
즉, 메서드에 전달되는 변수의 실제 값이 아닌 변수의 복사본이 전달됨.
change 메서드의 str 매개변수는 main 메서드의 str 변수의 복사본임.
change 메서드 내에서 str이 변경되어도 main 메서드의 str에는 영향을 미치지 않음.
[6-20] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
[주의] Math.random()을 사용하는 경우 실행결과와 다를 수 있음.
메서드명 : shuffle
기 능 : 주어진 배열에 담긴 값의 위치를 바꾸는 작업을 반복하여 뒤섞이게 한다.
처리한 배열을 반환한다.
반환타입 : int[]
매개변수 : int[] arr - 정수값이 담긴 배열
답:
class Exercise6_20 {
/*
[1,2,3,4,5,6,7,8,9]
[4,6,8,3,2,9,7,1,5]
*/
// 메서드
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);
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return arr;
}
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));
}
}
풀이
// - shuffle 메서드
// 메서드 정의 및 입력 검사
public static int[] shuffle(int[] arr) {
if (arr == null || arr.length == 0) return arr;
// 배열 arr이 null이거나 길이가 0인 경우, 그대로 반환하여 이후의 작업을 수행하지 않음.
//배열 요소 섞기
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;
}
/*
배열의 각 요소에 대해 반복문을 사용.
Math.random() 메서드를 사용하여 배열의 길이 내에서 무작위 인덱스 j를 생성.
현재 인덱스 i의 요소와 무작위 인덱스 j의 요소를 교환하여 배열을 섞음.
*/
// 배열 반환
return arr;
// main 메서드
// 원본 배열 출력
int[] original = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(.util.Arrays.toString(original));
// 배열 original을 초기화하고 .util.Arrays.toString 메서드를 사용하여 배열을 문자열로 변환하여 출력.
// 배열 섞기 및 결과 출력
int[] result = shuffle(original);
System.out.println(.util.Arrays.toString(result));
// shuffle 메서드를 호출하여 원본 배열 original을 섞고, 그 결과를 배열 result에 저장.
// 섞인 배열을 .util.Arrays.toString 메서드를 사용하여 문자열로 변환하여 출력.
[6-21] TV클래스를 주어진 로직대로 완성하시오.
완성한 후에 실행해서 주어진 실행결과와 일치하는지 확인하라.
[참고] 코드를 단순히 하기 위해서 유효성검사는 로직에서 제외했다.
CH:100, VOL:0
CH:99, VOL:0
CH:100, VOL:100
답:
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);
}
}
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로 바꾼다.
channel++;
if (channel > MAX_CHANNEL) {
channel = MIN_CHANNEL;
}
}
void channelDown() {
// (5) channel의 값을 1감소시킨다.
// 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX_CHANNEL로 바꾼다.
channel--;
if (channel < MIN_CHANNEL) {
channel = MAX_CHANNEL;
}
}
}
[6-22] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
메서드명 : isNumber
기 능 : 주어진 문자열이 모두 숫자로만 이루어져있는지 확인한다.
모두 숫자로만 이루어져 있으면 true를 반환하고,
그렇지 않으면 false를 반환한다.
만일 주어진 문자열이 null이거나 빈문자열“”이라면 false를 반환한다.
반환타입 : boolean
매개변수 : String str - 검사할 문자열
[Hint] String클래스의 charAt(int i)메서드를 사용하면 문자열의 i번째 위치한 문자를 얻을 수 있다.
답:
class Exercise6_22 {
static boolean isNumber(String str) {
for (int i = 0; i < str.length(); i++) {
if(str.charAt(i)<'0' || str.charAt(i)>'9') {
return false;
}
}
return true;
}
public static void main(String[] args) {
String str = "123";
System.out.println(str+"는 숫자입니까? "+isNumber(str));
str = "1234o";
System.out.println(str+"는 숫자입니까? "+isNumber(str));
}
}
[6-23] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
메서드명 : max
기 능 : 주어진 int형 배열의 값 중에서 제일 큰 값을 반환한다.
만일 주어진 배열이 null이거나 크기가 0인 경우, -999999를 반환한다.
반환타입 : int
매개변수 : int[] arr - 최대값을 구할 배열
답:
class Exercise6_23 {
static int max(int[] arr){
int maxValue = 0;
if(arr==null||arr.length==0){
return -999999;
}
for (int i = 0; i < arr.length; i++){
for (int j = 0; j < arr.length; j++){
maxValue = Math.max(arr[i],arr[j]);
}
}
return maxValue;
}
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인 배열
}
}
[6-23] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.
메서드명 : abs
기 능 : 주어진 값의 절대값을 반환한다.
반환타입 : int
매개변수 : int value
답:
class Exercise6_24 {
static int abs(int param){
return Math.abs(param);
}
public static void main(String[] args)
{
int value = 5;
System.out.println(value+"의 절대값:"+abs(value));
value = -10;
System.out.println(value+"의 절대값:"+abs(value));
}
}
참고
Math.abs(정수) → 절대값
'개념' 카테고리의 다른 글
[JAVA의 정석] Chapter08_연습문제 (1) | 2024.12.13 |
---|---|
[JAVA의 정석] Chapter07_연습문제 (0) | 2024.12.10 |
[JAVA의 정석] Chapter05_연습문제 (0) | 2024.12.08 |
[JAVA의 정석] Chapter04_연습문제 (0) | 2024.09.19 |
[JAVA의 정석] Chapter03_연습문제 (0) | 2024.09.19 |