33 분 소요



[김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음↗️], [나도코딩 자바 코딩 무료 강의 (기본편)↗️]을 듣고 정리한 글입니다.



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
  • longdouble

명시적 형변환

  • 큰 범위에서 작은 범위의 대입은 소수점 버림, 오버플로우 문제가 발생할 수 있다.
  • 이때는 명시적 형변환을 사용해야한다.
  • (float) score, (double) score

같은 타입끼리의 계산은 같은 타입의 결과를 낸다.

  • int + intint,
  • double + doubledouble

서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.

  • int + doubledouble
  • int + longlong
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. 조건문

  • 특정 조건에 따라서 다른 코드를 실행하는 것을 조건문이라고 한다.
  • 조건문에는 ifswitch문이 있다.

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));
	}
}


카테고리:

업데이트:

댓글남기기