[Java] #4 Java 문법 정리
[김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음↗️], [나도코딩 자바 코딩 무료 강의 (기본편)↗️]을 듣고 정리한 글입니다.
1. 변수
1.1 변수 선언 및 초기화
- 변수 선언: 변수를 선언하면 컴퓨터의 메모리 공간을 확보해서 그곳에 데이터를 저장할 수 있다. 그리고 변수의 이름을 통해서 해당 메모리 공간에 접근할 수 있다. (EX:
int a;
,int b, c;
) - 변수 초기화: 변수를 선언하고, 선언한 변수에 처음으로 값을 저장하는 것을 변수 초기화라 한다. (EX:
a=3;
)
public class _03_Variables {
public static void main(String[] args) {
// (1) 변수 선언 및 초기화 한 번에
String name = "박시은"; // 문자열, 문자열을 다루기 위한 특별한 타입
char grade = 'A'; // 문자 하나
int hour = 15; // 정수
double score = 90.5; // 실수
boolean pass = true; // 불리언(boolean) true, false 입력 가능
// (2) 변수 값 읽기
System.out.println(name + "님 반갑습니다!");
System.out.println("현재 시각은 " + hour + "시입니다.");
System.out.println(name + "님의 평균 점수는 " + score + "입니다.");
System.out.println("학점은 " + score + "입니다.");
System.out.println("이번 시험에 합격했을까요? " + pass);
}
}
- 변수의 값은 변경이 가능한데, 변수의 값을 변경하면 변수에 들어있던 기존 값은 삭제된다.
- 변수 이름은 카멜케이스(camelCase)로 짓도록 하자!
1.2 자료형
변수는 데이터를 다루는 종류에 따라 다양한 형식이 존재한다.
- 이러한 형식을 영어로는 타입(type)이라고 하고, 우리말로는
형식
또는형
이라고 부른다. - 예를 들어,
int
타입,int
형식,int
형 등으로 다양하게 부르는 것이다. - 자바는 기본 자료형과 객체(레퍼런스, 참조) 자료형으로 뉜다.
1.2.1 자바의 기본 자료형
기본 자료형은 자바에서 가장 기본적인 데이터 타입으로, 값 자체를 저장한다. 자바는 총 8개의 기본 자료형을 제공한다.
- 메모리를 적게 사용하면 작은 숫자를 표현할 수 있고, 메모리를 많이 사용하면 큰 숫자를 표현할 수 있다.
- 변수를 선언하면 표현 범위에 따라 메모리 공간을 차지한다. 그래서 필요에 맞도록 다양한 타입을 제공한다.
- 실무에서는?
byte
,short
,float
,char
를 거의 사용하지 않는다!
자료(데이터)형 | 예약어(명령어) | 비트(바이트) | 값의 저장범위 |
---|---|---|---|
논리형 | boolean | 1 | (true, false) |
문자형 | char | 16(2) | 유니코드, 수치로는 0 ~ 65535 |
수치형(바이트) | byte | 8(1) | -128 ~ 127 |
수치형(16비트 정수) | short | 16(2) | -32,768 ~ 32,767 |
수치형(정수) | int | 32(4) | -2,147,438,648 ~ 2,147,438,647 |
수치형(64비트 정수) | long | 64(8) | -9223372036854775080 ~ 9223372036854775080 |
수치형(실수형) | float | 32(4) | 3.40282347E+38 ~1.40239846E-45, IEEE 754-1985 표준 |
수치형(64비트 실수형) | double | 64(8) | 1.79769313486231570E+308 ~ 4.94065645841265544E-324, IEEE 754- 1985 표준 |
package variables;
public class Var6 {
public static void main(String[] args) {
// 정수
byte b = 127;
short s = 32767;
int i = 2147483647;
long l = 9223372036854775807L;
// 실수
float f = 10.0f;
double d = 10.0;
//불리언(boolean)
boolean c = true;
}
}
- 정수 리터럴은
int
를 기본으로 사용하므로,long
형을 사용하려면L
을 붙혀서long
형으로 지정하기 - 실수 리터럴은 기본이
double
형을 지원하므로,float
형을 사용하려면f
를 붙혀서float
형으로 지정하기
1.2.2 자바의 객체(레퍼런스, 참조) 자료형
객체 자료형은 값이 저장된 메모리 위치(주소, 참조)를 저장하는 자료형이다.
-
기본 자료형을 제외한 모든 데이터 타입이 참조형 자료형에 속하며, 대표적으로 String, 배열, 클래스, 인터페이스 등이 있다.
- 힙(Heap) 메모리에 객체가 저장되며, 참조(주소)를 통해 해당 객체를 접근한다.
- 참조형 자료형은 값 자체를 비교하지 않고, 객체의 주소를 비교한다.
public class _02_DataTypes {
public static void main(String[] args) {
String name = "Java"; // 문자열
int[] numbers = {1, 2, 3, 4, 5}; // 배열
Person person = new Person(); // 클래스
}
}
1.4 리터럴
코드에서 개발자가 직접 적은
100
,10.5
,true
,'A'
,Hello Java
와 같은 고정된 값을 프로그래밍 용어로 리터럴이라 한다.
- 변수의 값은 변할 수 있지만 리터럴은 개발자가 직접 입력한 고정된 값이므로 리터럴 자체는 변하지 않는다.
- 참고: 리터럴(literal)이라는 단어의 어원이 문자 또는 글자를 의미한다.
int a = 100; // 정수 리터럴
double b = 10.5; // 실수 리터럴
boolean c = true; // 불리언 리터럴
char d = 'A'; // 문자 하나 리터럴
String e = "Hello Java"; // 문자열 리터럴
1.5 상수
final
키워드로 상수를 선언할 수 있다.
상수 이름은 대문자로 짓는다.
public class _04_Constants {
public static void main(String[] args) {
final String KR_COUNTRY_CODE ="+82";
System.out.println(KR_COUNTRY_CODE);
}
}
1.6 형 변환
묵시적 형변환 또는 자동 형변환
- 작은 범위에서 큰 범위로 대입할 수 있는 것을 말한다.
int
→long
long
→double
명시적 형변환
- 큰 범위에서 작은 범위의 대입은 소수점 버림, 오버플로우 문제가 발생할 수 있다.
- 이때는 명시적 형변환을 사용해야한다.
(float) score
,(double) score
같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
int + int
→int
,double + double
→double
서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
int + double
→double
int + long
→long
public class _05_TypeCasting {
public static void main(String[] args) {
// (1) 정수형에서 실수형으로 형 변환(int to float, double)
int score = 93;
System.out.println(score); // 93
System.out.println((float) score); // 93.0
System.out.println((double) score); // 93.0
// (2) 실수형에서 정수형으로 형 변환(float, double to int)
float score_f = 93.3F;
double score_d = 98.8;
System.out.println((int) score_f); // 93
System.out.println((int) score_d); // 98
// (3) 정수 + 실수 연산
score = 93 + (int) 98.8; // 93 + 98
System.out.println(score); // 191
score_d = (double) 93 + 98.8; // 93.0 + 98.8
System.out.println(score_d); // 191.8
// (4) 변수에 형변환된 데이터 집어넣기
// (4.1) int -> long -> float -> double (자동 형변환)
double convertedScoreDouble = score; // 191 -> 191.0
// (4.2) double -> float -> long -> int (수동 형변환)
int convertedScoreInt = (int) score_d; // 191.8 -> 191
}
}
public class _05_TypeCasting {
public static void main(String[] args) {
// (1) 숫자를 문자열로
String s1 = String.valueOf(93); // 방법1
s1 = Integer.toString(93); // 방법2
System.out.println(s1); // 93
String s2 = String.valueOf(98.8); // 방법1
s2 = Double.toString(98.8); // 방법2
System.out.println(s2); // 98.8
// (2) 문자열을 숫자로
int i = Integer.parseInt("93");
System.out.println(i); // 93
double d = Double.parseDouble("98.8");
System.out.println(d); // 98.8
}
}
퀴즈 #1
문제
- 버스 도착 정보를 출력하는 프로그램을 작성하시오. 각 정보는 적절한 자료형의 변수에 정의합니다. (파일명: _Quiz_01.java)
- 버스 번호는 “1234”, “상암08” 과 같은 형태
- 남은 시간은 분 단위 (예: 3분, 5분)
- 남은 거리는 km 단위(예: 1.5km, 0.8km)
정답
public class _Quiz_01 {
public static void main(String[] args) {
String busNo = "08";
int minute = 3;
float distance = 1.2f;
System.out.println("상암" + busNo + "번 버스");
System.out.println("약 " + minute + "분 후 도착");
System.out.println("남은 거리 " + distance + "km");
}
}
2. 연산자
2.1 산술 연산자
산술 연산자는 주로 숫자를 계산하는 데 사용된다.
+
(더하기), -
(빼기), *
(곱하기), /
(나누기), %
(나머지)
package operator;
public class OperatorAdd2 {
public static void main(String[] args) {
// (1) 일반 연산
System.out.println(4 + 2); // 6
System.out.println(4 - 2); // 2
System.out.println(4 * 2); // 8
System.out.println(4 / 2); // 2
System.out.println(5 / 2); // 2
System.out.println(2 / 4); // 0
System.out.println(5 % 2); // 1
// (2) 우선 순위 연산
System.out.println(2 + 2 * 2); // 6
System.out.println((2 + 2) * 2); // 8
// (3) 변수를 이용한 연산
int a = 20;
int b = 10;
int c;
c = a + b;
System.out.println(c); // 30
c = a - b;
System.out.println(c); // 10
c = a * b;
System.out.println(c); // 200
c = a / b;
System.out.println(c); // 2
c = a % b;
System.out.println(c); // 0
}
}
2.2 대입 연산자
대입 연산자
- 대입연산자 (
=
)는 값을 변수에 할당하는 연산자다. 이 연산자를 사용하면 변수에 값을 할당할 수 있다. - EX:
int a = 1
는 a라는 변수에 1이라는 값을 할당한다.
축약(복합) 대입 연산자
- 산술 연산자와 대입 연산자를 한번에 축약해서 사용할 수 있는데, 이것을 축약(복합) 대입 연산자라 한다.
+=
,-=
,*=
,/=
,%=
- EX:
i = i + 3
->i += 3
,i = i * 4
->i *= 4
public class _02_Operater2 {
public static void main(String[] args) {
int a = 5; // 5
a += 3; // 8 (5 + 3): a = a + 3
a -= 2; // 6 (8 - 2): a = a - 2
a *= 4; // 24 (6 * 4): a = a * 4
a /= 3; // 8 (24 / 3): a = a / 3
a %= 5; // 3 (8 % 5) : a = a % 5
System.out.println(a); // 3
}
}
2.3 비교 연산자
비교 연산자는 두 값을 비교하는 데 사용한다.
==
(동등성),!=
(불일치),>
(크다),<
(작다),>=
(크거나 같다),<=
(작거나 같다)- ⚠️ 문자열이 같은지 비교할 때는
==
이 아니라.equals()
메서드를 사용해야 한다. (목차: 3.2 문자열 비교) - ⚠️
=
는 대입연산자로 변수에 값을 대입하며,==
는 동등한지 확인하는 비교 연산자이다.
public class _03_Operator3 {
public static void main(String[] args) {
int a = 2;
int b = 3;
System.out.println(a == b); // false, a와 b는 같지 않다
System.out.println(a != b); // true, a와 b는 다르다
System.out.println(a > b);
`
boolean
`
// false, a는 b보다 크지 않다
System.out.println(a < b);
// true, a는 b보다 작다
System.out.println(a >= b); // false, a는 b보다 크거나 같지 않다
System.out.println(a <= b); // true, a는 b보다 작거나 같다
//결과를 boolean 변수에 담기
boolean result = a == b; //a == b: false
System.out.println(result); //false
}
}
2.4 논리 연산자
논리 연산자는
boolean
형인true
,false
를 비교하는데 사용한다.
&&
(그리고) : 두 피연산자가 모두 참이면 참을 반환, 둘중 하나라도 거짓이면 거짓을 반환||
(또는) : 두 피연산자 중 하나라도 참이면 참을 반환, 둘다 거짓이면 거짓을 반환!
(부정) : 피연산자의 논리적 부정을 반환. 즉, 참이면 거짓을, 거짓이면 참을 반환
public class _04_Operator4 {
public static void main(String[] args) {
System.out.println("&&: AND 연산");
System.out.println(true && true); //true
System.out.println(true && false);//false
System.out.println(false && false);//false
System.out.println("||: OR 연산");
System.out.println(true || true); //true
System.out.println(true || false);//true
System.out.println(false || false);//false
System.out.println("! 연산");
System.out.println(!true); //false
System.out.println(!false); //true
System.out.println("변수 활용");
boolean a = true;
boolean b = false;
System.out.println(a && b); // false
System.out.println(a || b); // true
System.out.println(!a); // false
System.out.println(!b); // true
}
}
논리연산자 활용
public class _04_Operator4 {
public static void main(String[] args) {
int a = 15;
//a는 10보다 크고 20보다 작다
boolean result = a > 10 && a < 20; //(a > 10) && (a < 20)
System.out.println("result = " + result); // result = true
}
}
2.5 삼항 연산자
단순히 참과 거짓에 따라서 특정 값을 구하는 경우 삼항 연산자 또는 조건 연산자라고 불리는
?:
연산자를 사용 할 수 있다.
결과 = (조건) ? (참의 경우 결과값) : (거짓의 경우 결과값)
public class _05_Operator5 {
public static void main(String[] args) {
int x = 5;
int y = 3;
int max = (x > y) ? x : y;
System.out.println(max); // 5
int min = (x < y) ? x : y;
System.out.println(min); // 3
boolean b = (x == y) ? true : false;
System.out.println(b); // false
String s = (x != y) ? "달라요" : "같아요";
System.out.println(s); // "달라요"
}
}
2.6 증감연산자
증가 및 감소 연산자를 줄여서 증감 연산자라 한다.
++
와--
로 표현된다.
++a
: 증감 연산자를 피연산자 앞에 둘 수 있다. 이것을 앞에 있다고 해서 전위(Prefix) 증감 연산자라 한다.a++
: 증감 연산자를 피연산자 뒤에 둘 수 있다. 이것을 뒤에 있다고 해서 후위(Postfix) 증감 연산자라 한다.
public class _05_Operator5 {
public static void main(String[] args) {
// 전위(Prefix) 증감 연산자
int aPrefix = 1;
int bPrefix = 2;
bPrefix = ++aPrefix; // a의 값을 먼저 증가시키고, 그 결과를 b에 대입
System.out.println("aPrefix = " + aPrefix + " bPrefix = " + bPrefix);// 결과: aPrefix = 2, bPrefix = 2
// 후위(Postfix) 증감 연산자
int aPostfix = 1;
int bPostfix = 2;
bPostfix = aPostfix++; // a의 현재 값을 b에 먼저 대입하고, 그 후 a 값을 증가시킴
System.out.println("aPostfix = " + aPostfix + " bPostfix = " + bPostfix);// 결과: aPostfix = 2, bPostfix = 1
}
}
증감 연산자 활용 예시 : 은행 대기번호 표
public class _01_Operater1 {
public static void main(String[] args) {
int waiting = 0;
System.out.println("대기 인원 : " + waiting++); // 대기 인원 : 0
System.out.println("대기 인원 : " + waiting++); // 대기 인원 : 1
System.out.println("대기 인원 : " + waiting++); // 대기 인원 : 2
System.out.println("총 대기 인원 : " + waiting); // 총 대기 인원 : 3
}
}
- 처음 번호표를 뽑았을 때, 대기를 아무도 하고 있지 않으면
대기 인원 : 0
- 차후 번호표를 뽑을 때마다 1씩 증가함
따라서 문장 결과를 출력한 후 연산을 해야하므로 waiting++
퀴즈 #2
문제
- 어린이 키에 따른 놀이 기구 탑승 가능 여부를 확인하는 프로그램을 작성하시오.(파일명: _Quiz_02.java)
- 키가 120 cm 이상인 경우에만 탑승 가능
- 삼항연산자 사용
정답
public class _Quiz_02 {
public static void main(String[] args) {
int height = 121;
String result = (height >= 120) ? ("키가 " + height + " 이므로 탑승 가능합니다.") : ("키가 " + height + " 이므로 탑승 불가능합니다.");
System.out.println(result); // 키가 121 이므로 탑승 가능합니다.
}
}
3. 문자
3.1 문자열
public class _01_String1 {
public static void main(String[] args) {
String s ="I Like Java";
System.out.println(s); // "I Like Java"
// (1) 문자열의 길이
System.out.println(s.length()); // 11
// (2) 대소문자 변환
System.out.println(s.toUpperCase()); // "I LIKE JAVA"
System.out.println(s.toLowerCase()); // "i like java"
// (3) 포함 관계
// (3.1) 포함된다면 true, 포함되지 않는다면 false
System.out.println(s.contains("Java")); // true
System.out.println(s.contains("C#")); // false
// (3.2) 위치 정보 확인
System.out.println(s.indexOf("Java")); // 7
System.out.println(s.indexOf("C#")); // 포함되지 않는다면 -1
System.out.println(s.indexOf("Like")); // 처음 일치하는 위치 정보 (2)
System.out.println(s.lastIndexOf("Java")); // 마지막 일치하는 위치 정보 (7)
System.out.println(s.startsWith("I Like")); // 이 문자열로 시작하면 true (아니면 false)
System.out.println(s.endsWith("Java")); // 이 문자열로 끝나면 true (아니면 false)
}
}
public class _02_String2 {
public static void main(String[] args) {
String s = "I Like Java";
// (1) 문자열 변환
System.out.println(s.replace("Java", "Python")); // "I Like Python"
// 인덱스 기준 3부터 시작(이전 내용은 삭제), 단 s 변수에 변환 결과가 반영되는 것은 아니다.
System.out.println(s.substring(4)); // "ke Java"
// "Like"가 시작하는 위치부터 끝까지의 부분 문자열을 출력
System.out.println(s.substring(s.indexOf("Like"))); // "Like Java"
// "Like"가 시작하는 위치부터, "Java"가 시작하는 위치 바로 앞까지
System.out.println(s.substring(s.indexOf("I"), s.indexOf("Java"))); // "I Like"
// (2) 공백 제거
s = " I love Java. ";
System.out.println(s.trim()); // 앞 뒤 공백 제거
// (3) 문자열 결합
String s1 = "Java";
String s2 = "Python";
System.out.println(s1 + ", " + s2); // "Java, Python"
System.out.println(s1.concat(", ").concat(s2)); // "Java, Python"
}
}
3.2 문자열 비교
- 자바에서 문자열을 비교하려고 할 때는
equals
를 사용해야 한다. ==
연산자는 문자열의 메모리 주소를 비교하므로, 두 문자열이 동일한 내용을 가지더라도 메모리 주소가 다르다면 false를 반환하기 때문이다.
package operator;
public class Comp2 {
public static void main(String[] args) {
// (1) 문자열 비교
String str1 = "Java";
String str2 = "Python";
boolean result1 = "hello".equals("hello"); // 리터럴 비교
boolean result2 = str1.equals("Java"); // 문자열 변수, 리터럴 비교
boolean result3 = str1.equals(str2); // 문자열 변수 비교
// 문자열 내용이 같으면 true, 다르면 false
System.out.println("result1 = " + result1); // true
System.out.println("result2 = " + result2); // true
System.out.println("result3 = " + result3); //false
// 대소문자 구분 없이 문자열 내용이 같은지 여부 체크
boolean result4= str2.equalsIgnoreCase("JAVA");
System.out.println("result3 = " + result4); // false
// (1) 문자열 비교 심화
String s1 = "1234";
String s2 = "1234";
System.out.println(s1.equals(s2)); // true
System.out.println(s1==s2); // true (참조)
s1=new String("1234");
s2=new String("1234"); // (newString 독립적인 메모리이므로 주소를 가짐)
System.out.println(s1.equals(s2)); // true
System.out.println(s1==s2); // false
}
}
3.3 특수 문자(이스케이프 문자)
\n
: 줄바꿈
public class _04_EscapeSequence {
public static void main(String[] args) {
System.out.println("자바가\n너무\n재밌어요"); // \n : 줄바꿈
System.out.println("---------------");
System.out.println("오늘의 운세는?\t행운"); // \t : 탭
System.out.println("---------------");
System.out.println("C:\\Program Files\\Java"); // \\ : 역슬래시
System.out.println("---------------");
System.out.println("단비가 \"냐옹\" 이라고 했어요"); // \" : 큰 따옴표
System.out.println("단비가 \'냐옹\' 이라고 했어요"); // \' : 작은 따옴표
}
}
퀴즈 #3
문제
- 주민등록번호에서 생년월일 및 성별까지만 출력하는 프로그램을 작성하시오(파일명: _Quiz_03.java)
- 주민등록번호는 13자리의 숫자로 구성
- 앞 6자리는 생년월일 정보, 뒷 7자리 중 첫 번째 숫자는 성별 정보
- 입력 데이터는 -을 포함한 14자리의 문자열 형태
예시
- “901231-1234567”인 경우 901231-1까지 출력
- “030708-4567890”인 경우 030708-4까지 출력
정답
public class _Quiz_03 {
public static void main(String[] args) {
String ID = "901231-1234567";
System.out.println(ID.substring(0, 8)); // 0 위치부터 8 위치 직전까지
System.out.println(ID.substring(0, ID.indexOf("-") + 2)); // 0 위치부터 하이픈 위치 +2 직전까지(똑같은 결과)
}
}
4. 조건문
- 특정 조건에 따라서 다른 코드를 실행하는 것을 조건문이라고 한다.
- 조건문에는
if
문switch
문이 있다.
4.1 if ~ else 문
if문
if
문은 특정 조건이 참인지 확인하고, 그 조건이 참(true)일 경우 특정 블록을 실행한다.
if (condition) {
// 조건이 참일 때 실행되는 코드
}
else
else
문은 if
문에서 만족하는 조건이 없을 때 실행하는 코드를 제공한다.
if (condition) {
// 조건이 참일 때 실행되는 코드
} else {
// 만족하는 조건이 없을 때 실행되는 코드
}
public class _01_If {
public static void main(String[] args) {
int height = 120;
boolean people = false;
if (height >= 130 || people == true) {
System.out.println("탑승 가능합니다.");
}
else {
System.out.println("탑승할 수 없습니다.");
}
}
}
4.2 else if 문
else if
문은 앞선if
문의 조건이 거짓일 때 다음 조건을 검사한다.
만약 앞선 if
문이 참이라면 else if
를 실행하지 않는다.
if (condition1) {
// 조건1이 참일 때 실행되는 코드
} else if (condition2) {
// 조건1이 거짓이고, 조건2가 참일 때 실행되는 코드
} else if (condition3) {
// 조건2이 거짓이고, 조건3이 참일 때 실행되는 코드
} else {
// 모든 조건이 거짓일 때 실행되는 코드
}
public class If4 {
public static void main(String[] args) {
int age = 14; // 연령을 설정
if (age <= 7) { // 0~7: 미취학
System.out.println("미취학");
}
else if (age <= 13) { // 8~13: 초등학생
System.out.println("초등학생");
}
else if (age <= 16) { // 14~16: 중학생
System.out.println("중학생");
}
else if (age <= 19) { // 17~19: 고등학생
System.out.println("고등학생");
}
else { // 20세 이상: 성인
System.out.println("성인");
}
}
}
- ⚠️
if
문에else if
를 함께 사용하는 것은 서로 연관된 조건일 때 사용한다. 그런데 서로 관련이 없는 독립 조건이면else if
를 사용하지 않고if
문을 각각 따로 사용해야 한다.
4.3 switch 문
switch
문은if
문을 조금 더 편리하게 사용할 수 있는 기능이다.
⚠️ if
문은 비교 연산자를 사용할 수 있지만, switch
문은 단순히 값이 같은지만 비교할 수 있다.
switch
문은 조건식에 해당하는 특정 값으로 실행할 코드를 선택한다.
switch(조건식) {
case value1:
// 조건식의 결과 값이 value1일 때 실행되는 코드
break;
case value2:
// 조건식의 결과 값이 value2일 때 실행되는 코드
break;
...
default:
// 조건식의 결과 값이 위의 어떤 값에도 해당하지 않을 때 실행되는 코드
break;
}
switch
문을 사용해보자
package cond;
public class Switch3 {
public static void main(String[] args) {
//grade 1:1000, 2:3000(변경), 3:3000, 나머지: 500
int grade = 2;
int coupon;
switch (grade) {
case 1:
coupon = 1000;
break;
// case 2와 3을 통합
case 2:
case 3:
coupon = 3000;
break;
default:
coupon = 500;
break;
}
System.out.println("발급받은 쿠폰 " + coupon);
}
}
break가 없는 경우 예제 -> 값이 누적됨
public class _03_SwitchCase {
public static void main(String[] args) {
// 중고상품의 등급에 따른 가격을 책정 (1등급 : 최상, 4등급 : 최하)
int grade = 1; // 등급
int price=7000; // 기본 가격
switch(grade) {
case 1:
price+=1000; // price = price + 1000;
case 2:
price+=1000;
case 3:
price+=1000;
}
System.out.println(grade+"등급 제품의 가격 : "+ price+"원");
}
}
4.4 새로운 switch문
새로운
switch
문은 기존의switch
문보다 간결하고 읽기 쉬운 구문을 제공한다.
->
를 사용하며, 선택된 데이터를 반환할 수 있다
public class Switch3 {
public static void main(String[] args) {
// grade 1:1000, 2:2000, 3:3000, 나머지: 500
int grade = 2; // 등급 설정
// 새로운 switch 문을 사용하여 쿠폰 값을 결정
int coupon = switch (grade) {
case 1 -> 1000; // grade가 1일 때 쿠폰 1000
case 2 -> 2000; // grade가 2일 때 쿠폰 2000
case 3 -> 3000; // grade가 3일 때 쿠폰 3000
default -> 500; // 그 외의 경우 쿠폰 500
};
// 결과 출력
System.out.println("발급받은 쿠폰: " + coupon);
}
}
5. 반복문
- 반복문은 이름 그대로 특정 코드를 반복해서 실행할 때 사용한다.
- 자바는
while
,do-while
,for
의 반복문을 제공한다
5.1 for 문
for문은 주로 반복 횟수가 정해져 있을 때 사용한다.
for (초기식; 조건식; 증감식) {
// 코드
}
for (; ; )
: 조건이 없기 때문에 무한 반복하는 코드가 된다.
for문 실습
public class _04_For {
public static void main(String[] args) {
// 5번 반복
for (int i = 0; i < 5; i++) {
System.out.println("시은님, 즐거운 하루 되세요!");
}
// 짝수만 출력
// 0, 2, 4, 6, 8
for (int i = 0; i < 10; i += 2) {
System.out.println(i);
}
// 홀수만 출력
// 1, 3, 5, 7, 9
for (int i = 1; i < 10; i += 2) {
System.out.println(i);
}
// 거꾸로 숫자
// 5, 4, 3, 2, 1
for (int i = 5; i > 0; i--) {
System.out.println(i);
}
// 1부터 10까지 수들의 합
// 1 + 2 + ... + 10 = 55
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
System.out.println(sum);
}
}
5.2 while 문
while문은 조건에 따라 코드를 반복해서 실행할 때 사용한다.
while (조건식) {
// 코드
}
- 조건식을 확인한다. 참이면 코드 블럭을 실행하고, 거짓이면 while문을 벗어난다.
- 조건식이 참이면 코드 블럭을 실행한다. 이후에 코드 블럭이 끝나면 다시 조건식 검사로 돌아가서 조건식을 검사 한다.(무한 반복)
while 문 실습
public class _05_While {
public static void main(String[] args) {
int distance = 10; // 전체 거리 25m
int move = 0; // 현재 이동 거리 0m
while (move < distance) { // 현재 이동 거리가 전체 거리보다 작다는 조건이 참인 동안 반복 수행
System.out.println("발차기를 계속 합니다.");
System.out.println("현재 이동 거리 " + move);
move += 3; // 3미터 이동
}
System.out.println("도착하였습니다.");
}
}
5.3 do-while문
while
문과 비슷하지만, 조건 상관 없이do{()}
의 문장을 무조건 한 번 실행시킨 후 조건을 검사하여 반복한다.
즉, 조건에 만족하지 않아도 최초 한 번은 현재 값을 출력하고 싶을 때 사용한다.
do{
// 반복 실행할 문장;
} while(조건식) // 조건식이 true일 경우 실행, false일 경우 미실행
do-while문 실습
while
문 사용i=10
이기 때문에 조건식이 거짓이 되어 아무것도 출력되지 않는다.
public class DoWhile1 {
public static void main(String[] args) {
int i = 10; // 초기값 설정
while (i < 3) { // 조건이 false이므로 블록 실행되지 않음
System.out.println("현재 숫자는: " + i);
i++;
}
// 출력 결과: 없음
}
}
do-while
문 사용do-while
문은 최초 한 번은 항상 실행이 되어현재 숫자는: 10
이 출력된다.- 코드 블럭을 실행 후에 조건식을 검증하는데,
i=11
이기 때문에 조건식이 거짓이 되어do-while
문을 빠져나온다.
public class DoWhile2 {
public static void main(String[] args) {
int i = 10; // 초기값 설정
do {
System.out.println("현재 숫자는: " + i); // 현재 숫자는: 10
i++;
} while (i < 3); // 조건을 확인
}
}
5.4 break, continue
break
,continue
와 는 반복문에서 사용할 수 있는 키워드다.for
,while
,do-while
와 같은 반복문에서 사용할 수 있다.
break
: 반복문을 즉시 종료하고 나간다.continue
: 반복문의 나머지 부분을 건너뛰고 다음 반복으로 진행하는 데 사용된다.
break
를 만나면 코드 2가 실행되지 않고while
문이 종료된다.
**
while(조건식) {
코드1;
break;//즉시 while문 종료로 이동한다.
코드2;
}
//while문 종료
// 문제: 1부터 시작해서 숫자를 계속 누적해서 더하다가 합계가 10보다 처음으로 큰 값은 얼마인가?
package loop;
public class Break1 {
public static void main(String[] args) {
int sum = 0; // 누적 합계
int i = 1; // 시작 숫자
while (true) { // 무한 루프
sum += i; // i를 sum에 추가
if (sum > 10) { // 합계가 10보다 크면
System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
break; // while문 종료
}
i++; // 다음 숫자로 이동
}
}
}
continue
를 만나면 코드 2가 실행되지 않고 다시 조건식으로 이동한다. 조건식이 참이면while
문을 실행한다.
while (조건식) {
코드1;
continue; //즉시 조건식으로 이동한다.
코드2;
}
// 문제: 1부터 5까지 숫자를 출력하는데, 숫자가 3일 때는 출력을 건너뛰어야 한다.
package loop;
public class Continue1 {
public static void main(String[] args) {
int i = 1; // 시작 숫자
while (i <= 5) { // 1부터 5까지 반복
if (i == 3) { // i가 3이면
i++; // i 증가
continue; // 현재 루프의 나머지 코드를 건너뛰고 조건식으로 이동
}
System.out.println(i);
i++; // i 증가
}
}
}
5.7 중첩 반복문
반복문은 내부에 또 반복문을 만들 수 있다.
for
,while
ahen rksmdgkek.
① 별(*) 사각형 만들기
package chap_04;
public class _07_NestedLoop {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
② 별(*) 왼쪽 삼각형 만들기
package chap_04;
public class _07_NestedLoop {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j <i+1 ; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
③ 별(*) 오른쪽 삼각형 만들기
public class _08_NestedLoop {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
for (int k = 0; k < 2 - i; k++) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println(" ");
}
}
}
④ 구구단 만들기
public class _09_MultpleTable {
public static void main(String[] args) {
for (int i = 2; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.println(i + " x " + j + " = " + i * j);
}
System.out.println();
}
}
}
6. 사용자 입력 받기
6.1 Scanner 클래스
System.out
을 통해서 출력을 했듯이,System.in
을 통해서 사용자의 입력을 받을 수 있다.
- 하지만 이를 직접 사용하면 복잡할 수 있으므로, Java에서는
Scanner
클래스를 제공하여 더 쉽게 사용자 입력을 받을 수 있도록 한다. - Scanner 클래스는 사용자가 입력한 데이터를 편리하게 읽을 수 있는 다양한 메서드를 제공합한다.
- 예를 들어,
nextLine()
,nextInt()
,nextDouble()
등을 사용하여 각각 문자열, 정수, 실수를 읽을 수 있다.
package scanner;
import java.util.Scanner;
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("문자열을 입력하세요: ");
String str = scanner.nextLine(); // 입력을 String으로 가져옴
System.out.println("입력한 문자열: " + str);
System.out.print("정수를 입력하세요: ");
int intValue = scanner.nextInt(); // 입력을 int로 가져옴
System.out.println("입력한 정수: " + intValue);
System.out.print("실수를 입력하세요: ");
double doubleValue = scanner.nextDouble(); // 입력을 double로 가져옴
System.out.println("입력한 실수: " + doubleValue);
scanner.close(); // Scanner 객체를 닫는다.
}
}
⚠️ 입력 타입이 다르면 InputMismatchException
오류가 발생한다. 예를 들어, 정수를 요구하는 곳에 문자를 입력하면 오류가 발생한다.
6.2 print() vs println()
print()
: 줄 바꿈 없이 출력한다.println()
: 출력 후 줄 바꿈을 한다.
System.out.print("hello");
System.out.print("world");
// 결과: helloworld
System.out.println("hello");
System.out.println("world");
// 결과:
// hello
// world
6.3 Scanner 기본 예제
두 수를 입력받고, 합을 출력하기
package scanner;
import java.util.Scanner;
public class Scanner2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = scanner.nextInt();
System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = scanner.nextInt();
int sum = num1 + num2;
System.out.println("두 숫자의 합: " + sum);
scanner.close();
}
}
사용자로부터 두 개의 정수를 입력 받고, 더 큰 수를 출력하기
package scanner;
import java.util.Scanner;
public class Scanner3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = scanner.nextInt();
System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = scanner.nextInt();
if (num1 > num2) {
System.out.println("더 큰 숫자: " + num1);
} else if (num2 > num1) {
System.out.println("더 큰 숫자: " + num2);
} else {
System.out.println("두 숫자는 같습니다.");
}
scanner.close();
}
}
6.4 Scanner 반복 예제
사용자가 입력한 문자열을 그대로 출력하기
exit
라는 문자가 입력되면 프로그램을 종료- 프로그램은 반복해서 실행
package scanner;
import java.util.Scanner;
public class ScannerWhile1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("문자열을 입력하세요 (exit: 종료): ");
String str = scanner.nextLine();
if (str.equals("exit")) {
System.out.println("프로그램을 종료합니다.");
break;
}
System.out.println("입력한 문자열: " + str);
}
scanner.close();
}
}
첫 번째 숫자와 두 번째 숫자를 더해서 출력하기
- 첫 번째 숫자와 두 번째 숫자 모두 0을 입력하면 프로그램을 종료
- 프로그램은 반복해서 실행
package scanner;
import java.util.Scanner;
public class ScannerWhile2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("첫 번째 숫자와 두 번째 숫자 모두 0을 입력하면 프로그램을 종료합니다.");
while (true) {
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = scanner.nextInt();
System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = scanner.nextInt();
if (num1 == 0 && num2 == 0) {
System.out.println("프로그램 종료");
break;
}
int sum = num1 + num2;
System.out.println("두 숫자의 합: " + sum);
}
scanner.close();
}
}
사용자 입력을 받아 그 합계를 계산하기
- 사용자는 한 번에 한 개의 정수를 입력할 수 있으며, 사용자가 0을 입력하면 프로그램은 종료
- 이 때, 프로그램이 종료될 때까지 사용자가 입력한 모든 정수의 합을 출력하기.
package scanner;
import java.util.Scanner;
public class ScannerWhile3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int sum = 0;
while (true) {
System.out.print("정수를 입력하세요 (0을 입력하면 종료): ");
int number = input.nextInt();
if (number == 0) {
break;
}
sum += number; // 사용자가 입력한 값을 누적
}
System.out.println("입력한 모든 정수의 합: " + sum);
input.close();
}
}
7. 배열
배열은 같은 타입의 변수를 사용하기 편하게 하나로 묶어둔 것이다.
7.1 배열의 선언 및 초기화
배열 변수 선언
- 배열을 사용하려면
int[] students;
와 같이 배열 변수를 선언해야 한다. - 배열 변수를 선언한다고해서 아직 사용할 수 있는 배열이 만들어진 것은 아니다.
배열 생성 및 초기화
coffees = new int[5];
는 크기가 5인 정수형 배열을 생성한다.- 이때, Java는 자동으로 배열의 각 요소를 기본값으로 초기화한다.
- 숫자는 0, boolean은 false, String은 null로 초기화 된다.
- 생성된 배열은 메모리에서 참조값을 가지며, 이 참조값은 coffees 변수에 저장된다.
7.2 배열 사용
배열의 각 요소에 값을 대입할 때는 대괄호
[]
안에 인덱스를 지정한다.
- 배열의 인덱스는
0
부터 시작하므로,coffees[0]
는 첫 번째 요소를 의미한다. - 인덱스 범위를 벗어나면
ArrayIndexOutOfBoundsException
오류가 발생한다.
// 배열 선언 첫 번째 방법
String[] coffees = new String[4];
// 두 번째 방법
String[] coffees = new String[4];
coffees[0] = "아메리카노"; // 0부터 시작
coffees[1] = "카페 모카";
coffees[2] = "라떼";
coffees[3] = "카푸치노";
// 세 번째 방법 - 생성과 동시에 편리하게 초기화
String[] coffees = new String[] { "아메리카노", "카페모카", "라떼", "카푸치노" };
// 네 번째 방법 - 배열 생성 간략 버전, 배열 선언과 함께 사용시 new String[] 생략 가능
String[] coffees = { "아메리카노", "카페모카", "라떼", "카푸치노" };
실습
public class _01_Array {
public static void main(String[] args) {
String[] coffees = { "아메리카노", "카페모카", "라떼", "카푸치노" };
// 커피 주문
System.out.println(coffees[0] + " 하나"); // "아메리카노 하나"
System.out.println(coffees[1] + " 하나"); // "카페모카 하나"
coffees[2]="에소프레소"; // 값 변경
System.out.println(coffees[2] + " 하나"); // "에소프레소 하나"
System.out.println(coffees[3] + " 하나"); // "카푸치노 하나"
System.out.println("주세요."); // "주세요"
}
}
7.3 배열 순회
public class _02_ArrayLoop {
public static void main(String[] args) {
String[] coffees = { "아메리카노", "카페모카", "라떼", "카푸치노" };
// for 반복문 순회
for (int i = 0; i < 4; i++) {
System.out.println(coffees[i] + " 하나");
}
System.out.println("주세요.");
// 배열의 길이를 이용한 순회
for (int i = 0; i < coffees.length; i++) {
System.out.println(coffees[i] + " 하나");
}
System.out.println("주세요.");
// enhanced for (for-each) 반복문 (단축키: iter)
for (String coffee : coffees) {
System.out.println(coffee + " 하나");
}
}
}
7.4 다차원 배열(2차원 배열)
int[][] arr = new int[2][3]
와 같이 선언하고 생성한다. 그리고,arr[1][2]
와 같이 사용한다.
public class _03_MultiArray {
public static void main(String[] args) {
// 소규모 영화관 좌석
// 1차원 배열
String[] seatA = { "A1", "A2", "A3", "A4", "A5" };
String[] seatB = { "B1", "B2", "B3", "B4", "B5" };
String[] seatC = { "C1", "C2", "C3", "C4", "C5" };
// 3 x 5 크기의 2차원 배열
String[][] seats=new String[][] {
{ "A1", "A2", "A3", "A4", "A5" },
{ "B1", "B2", "B3", "B4", "B5" },
{ "C1", "C2", "C3", "C4", "C5" }
};
System.out.println(seats[1][1]); // B2
System.out.println(seats[2][4]); // C5
// 첫 줄에는 3칸, 둘째 줄에는 4칸, 셋째 줄에는 5칸
String[][] seats2= {
{"A1","A2","A3"},
{"B1","B2","B3","B4"},
{"C1","C2","C3","C4","C5"}
};
System.out.println(seats2[0][2]); // A3
}
}
7.5 다차열 배열 순회
public class _04_MultArrayLoop {
public static void main(String[] args) {
// 다차열 배열 순회
String[][] seats = new String[][] { { "A1", "A2", "A3", "A4", "A5" }, { "B1", "B2", "B3", "B4", "B5" },
{ "C1", "C2", "C3", "C4", "C5" } };
for (int i = 0; i < 3; i++) { // 세로
for (int j = 0; j < 5; j++) { // 가로
System.out.print(seats[i][j] + " ");
}
System.out.println();
}
System.out.println("-------------------");
String[][] seats2 = { { "A1", "A2", "A3" }, { "B1", "B2", "B3", "B4" }, { "C1", "C2", "C3", "C4", "C5" } };
for (int i = 0; i < seats2.length; i++) { // 세로
for (int j = 0; j < seats2[i].length; j++) { // 가로
System.out.print(seats2[i][j] + " ");
}
System.out.println();
}
System.out.println("-------------------");
// 세로 크기 10 x 가로 크기 15에 해당하는 영화관 좌석
String[][] seats3 = new String[10][15];
String[] eng = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
for (int i = 0; i < seats3.length; i++) { // 세로
for (int j = 0; j < seats3[i].length; j++) { // 가로
seats3[i][j] = eng[i] + (j + 1);
}
}
// 표 구매
seats3[7][8]="__";
seats3[7][9]="___";
// 영화관 좌석 번호 확인
for (int i = 0; i < seats3.length; i++) { // 세로
for (int j = 0; j < seats3[i].length; j++) { // 가로
System.out.print(seats3[i][j] + " ");
}
System.out.println();
}
}
}
7.6 아스키 코드
아스키 코드 (ANSI) : 미국 표준 코드
public class _05_ASCII {
public static void main(String[] args) {
// 알파벳 대문자(A)는 65부터 시작
char c = 'A';
System.out.println(c); // A
System.out.println((int) c); // 65
// 소문자(a)는 97부터 시작
c = 'a';
System.out.println(c); // a
System.out.println((int) c); // 97
c = 'B';
System.out.println(c); // B
System.out.println((int) c); // 66
c++;
System.out.println(c); // C
System.out.println((int) c); // 67
// 숫자(0)은 48부터 시작
c = '0';
System.out.println(c); // 0
System.out.println((int) c); // 48
}
}
아스키 코드 활용해서 목차 6.4 영화관 좌석 코드 리팩토링
public class _05_ASCII {
public static void main(String[] args) {
// 세로 크기 10 x 가로 크기 15에 해당하는 영화관 좌석
String[][] seats3 = new String[10][15];
char ch = 'A';
for (int i = 0; i < seats3.length; i++) { // 세로
for (int j = 0; j < seats3[i].length; j++) { // 가로
seats3[i][j] = String.valueOf(ch) + (j + 1);
}
ch++;
}
// 영화관 좌석 번호 확인
for (int i = 0; i < seats3.length; i++) { // 세로
for (int j = 0; j < seats3[i].length; j++) { // 가로
System.out.print(seats3[i][j] + " ");
}
System.out.println();
}
}
}
퀴즈 #7
문제
- 배열을 활용하여 쇼핑몰에서 구매 가능한 신발 사이즈 옵션을 출력하는 프로그램을 작성하시오
- 신발 사이즈는 250부터 295까지 5단위로 증가
- 신발 사이즈는 총 10까지
정답
⬇️ 내 풀이
public class _Quiz_05 {
public static void main(String[] args) {
int[] shoesSize = { 250, 255, 260, 265, 270, 275, 280, 285, 290, 295 };
for(int i=0;i<shoesSize.length;i++) {
System.out.println("사이즈 " + shoesSize[i] + " (재고 있음)");
}
}
}
⬇️ 선생님 풀이
public class _Quiz_05 {
public static void main(String[] args) {
int[] shoseSize = new int[10];
for (int i = 0; i < shoseSize.length; i++) {
shoseSize[i] = 250 + (5 * i);
}
// for each 사용
for (int size : shoseSize) {
System.out.println("사이즈 " + size + " 재고 있음");
}
}
}
8. 메서드
8.1 메서드 정의와 호출
메서드는 특정 작업을 수행하기 위한 코드 블록으로, 자바에서는 함수를 메서드(Method)라 한다.
public class Main {
public static void main(String[] args) {
// 메서드 호출
int sum1 = add(5, 10);
System.out.println("결과1 출력:" + sum1);
int sum2 = add(15, 20);
System.out.println("결과2 출력:" + sum2);
}
// 메서드 정의
public static int add(int a, int b) {
System.out.println(a + "+" + b + " 연산 수행");
int sum = a + b;
return sum;
}
}
메서드는 크게 메서드 선언과 메서드 본문으로 나눌 수 있다.
- 메서드 선언
public static int add(int a, int b)
- 메서드의 선언 부분으로, 메서드 이름, 반환 타입, 매개변수(파라미터) 목록을 포함한다.
- 이름 그대로 이런 메서드가 있다고 선언하는 것이다. 메서드 선언 정보를 통해 다른 곳에서 해당 메서드를 호출할 수 있다.
-
메서드 본문
{ System.out.println(a +"+"+b+" 연산 수행"); int sum = a + b; return sum; }
- 메서드가 수행해야 하는 코드 블록이다.
- 메서드를 호출하면 메서드 본문이 순서대로 실행된다.
- 메서드의 실행 결과를 반환하려면
return
문을 사용해야 한다.return
문 다음에 반환할 결과를 적어주면 된다. return
문을 만나면 그 즉시 메서드를 빠져나간다.
8.2 반환 값(Return)
반환 타입이 있는 메서드는 반드시 값을 반환해야 한다.
- 반환 타입이 있는 메서드는
return
문을 사용하여 값을 반환해야 한다. - 조건문을 사용하여 반환하는 경우, 모든 조건에서 값을 반환하도록 주의해야 한다.
public class _03_Return {
public static void main(String[] args) {
String contactNumber = getPhoneNumber();
System.out.println("호텔 전화번호 : " + contactNumber);
System.out.println("호텔 액티비티 : " + getActivities());
}
public static String getPhoneNumber() {
String phoneNumber = "02-1234-5678";
return phoneNumber;
}
public static String getActivities() {
return "볼링장, 탁구장, 노래방";
}
}
8.3 매개변수(Parameter)
메서드를 정의할 때 선언한 변수인
String str
,int age
를 매개변수, 파라미터라 한다.
- 메서드를 호출할 때 인수를 넘기면, 그 인수가 매개변수에 대입된다.
- 실무에서는 매개변수, 파라미터 용어를 모두 사용한다.
public class _02_Parameter {
public static void power(int number) {
int result = number * number;
System.out.println(number + "의 2승은 " + result);
}
public static void powerByExp(int number, int exponent) {
int result = 1;
for (int i = 0; i < exponent; i++) {
result *= number;
}
System.out.println(number + "의 "+ exponent+"승은 " + result);
}
public static void main(String[] args) {
power(4); // 4 * 4 = 16
powerByExp(2, 3); // 2 * 2 * 2 = 8
}
}
8.4 전달 값과 반환 값
전달 값과 반환 값을 함께 사용하는 예시
public class _04_ParameterAndReturn {
public static int getPower(int number) {
int result = number * number;
return result;
}
public static int getPowerByExp(int number, int exponent) {
int result = 1;
for (int i = 0; i < exponent; i++) {
result *= number;
}
return result;
}
public static void main(String[] args) {
int retVal = getPower(2);
System.out.println(retVal); // 2 * 2 = 4
retVal = getPower(3);
System.out.println(retVal); // 3 * 3 = 9
retVal = getPowerByExp(3, 3); // 3 * 3 * 3 = 27
System.err.println(retVal);
}
}
8.5 메서드 호출과 값 전달⭐⭐
자바는 항상 변수의 값을 복사해서 대입한다.⭐⭐⭐
- 매개변수의 이름이 같더라도 서로 다른 변수이며, 한 변수의 값 변경은 다른 변수에 영향을 주지 않는다.
- 값을 반환하여 메서드 외부에서 사용할 수 있다.
변수와 값 복사
- num1의 값이 num2에 복사된다.
- 이후 num2의 값을 변경해도 num1은 변하지 않는다.
package method;
public class MethodValue0 {
public static void main(String[] args) {
int num1 = 5;
int num2 = num1; // num1의 값을 복사
num2 = 10; // num2의 값을 변경
System.out.println("num1=" + num1); // num1=5
System.out.println("num2=" + num2); // num2=10
}
}
메서드 호출과 값 복사
- 여기서 changeNumber(num1) 호출 시 num1의 값이 복사되어 num2에 전달된다.
- num2의 값을 변경해도 num1에는 영향을 주지 않는다.
package method;
public class MethodValue1 {
public static void main(String[] args) {
int num1 = 5;
System.out.println("1. changeNumber 호출 전, num1: " + num1);
changeNumber(num1);
System.out.println("4. changeNumber 호출 후, num1: " + num1);
}
public static void changeNumber(int num2) {
System.out.println("2. changeNumber 변경 전, num2: " + num2);
num2 = num2 * 2;
System.out.println("3. changeNumber 변경 후, num2: " + num2);
}
}
변수 이름이 같은 경우
- 각각의 메서드 안에서 사용하는 변수는 서로 완전히 분리된 다른 변수이다.
- 따라서 main()의 number와 changeNumber()의 number는 서로 다른 변수이다.
package method;
public class MethodValue2 {
public static void main(String[] args) {
int number = 5;
System.out.println("1. changeNumber 호출 전, number: " + number);
changeNumber(number);
System.out.println("4. changeNumber 호출 후, number: " + number);
}
public static void changeNumber(int number) {
System.out.println("2. changeNumber 변경 전, number: " + number);
number = number * 2;
System.out.println("3. changeNumber 변경 후, number: " + number);
}
}
메서드에서 값 반환하기
- 메서드를 사용해서 값을 변경하려면 메서드의 호출 결과를 반환받아서 사용하면 된다.
- changeNumber 메서드는 num2의 값을 변경한 후 그 값을 반환한다.
package method;
public class MethodValue3 {
public static void main(String[] args) {
int num1 = 5;
System.out.println("changeNumber 호출 전, num1: " + num1);
num1 = changeNumber(num1);
System.out.println("changeNumber 호출 후, num1: " + num1);
}
public static int changeNumber(int num2) {
num2 = num2 * 2;
return num2; // 변경된 값을 반환
}
}
퀴즈 #6
문제
- 개인 정보 중 일부를 비공개로 전환하는 프로그램을 작성하시오(파일명 : _Quiz_06.java)
- 개인정보를 비공개로 전환하는 메소드 작성
- 하나의 메소드에서 모든 동작 처리
- 각 정보는 아래 위치부터 비공개 적용
- 이름 : 2번째 글자
- 주민등록번호 : 9번째 글자
- 전화번호 : 10번째 글자
코드
주어진 코드의 getHiddenData(...)
메소드를 완성하시오.
public class _Quiz_06 {
// 힌트
// 1. substring()을 이용하면 문자열의 일부를 자를 수 있음
// 2. length()를 이용하면 문자열의 길이를 알 수 있음
public static void main(String[] args) {
String name = "나코딩";
String id = "990130-1234567";
String phoneNumber = "010-1234-5678";
System.out.println("이름 : " + getHiddenData(name, 1)); // 개인정보, 비공개 시작 위치
System.out.println("주민등록번호 : " + getHiddenData(id, 8));
System.out.println("전화번호 : " + getHiddenData(phoneNumber, 9));
}
}
정답
public class _Quiz_06 {
// 힌트
// 1. substring()을 이용하면 문자열의 일부를 자를 수 있음
// 2. length()를 이용하면 문자열의 길이를 알 수 있음
public static String getHiddenData(String data, int index) {
String hiddenData = data.substring(0, index);
// for (int i = index; i < data.length(); i++)
for (int i = 0; i < data.length() - index; i++) {
hiddenData += "*";
}
return hiddenData;
}
public static void main(String[] args) {
String name = "나코딩";
String id = "990130-1234567";
String phoneNumber = "010-1234-5678";
System.out.println("이름 : " + getHiddenData(name, 1)); // 개인정보, 비공개 시작 위치
System.out.println("주민등록번호 : " + getHiddenData(id, 8));
System.out.println("전화번호 : " + getHiddenData(phoneNumber, 9));
}
}
댓글남기기