Doit ! Java_2

박다현·2023년 9월 18일
0

likelion

목록 보기
20/23
post-thumbnail

01 제어문과 제어 키워드


1.1 제어문

제어문 = ' 프로그램의 처리 순서를 바꾸는 것'
선택 제어문 : if, switch
반복 제어문 : for, while, do-while


1.1.1 선택 제어문

  • if 선택 제어문
    조건식에따라 실행문의 실행 여부를 결정하는 선택 제어문

중괄호를 생략했을 때 제어문의 동작
if 문을 포함한 모든 제어문은 중괄호를 포함하며 생략했을 때에는 컴파일러가 자동으로 삽입

주의해야 할 점 : 컴파일러가 삽입하는 중괄호는 반드시 하나의 실행 구문만을 감싼다는 것

# if 단일 구문 : 조건식 1개, 중괄호 1개

if (조건식) { // boolean 타입 (true, false)만 가능
	실행 구문; // 조건식이 true일 때만 실행
}
# if-else 구문 : 조건식 1개, 중괄호 2개

if (조건식) {
	실행 구문;
}
else {
	실행 구문; // 조건식이 false일 때만 실행 (생략 가능)
}
# if-else if-else 구문 : 조건식 N개, 중괄호 N+1개

if (조건식 1) {
	실행 구문; // 조건식 1이 true일 때 실행한 후 제어문 탈출
}
else if (조건식 2) {
	실행 구문; // 조건식 2가 true일 때 실행한 후 제어문 탈출
}
.
.
else if (조건식 N) {
	실행 구문; // 조건식 N이 true일 때 실행한 후 제어문 탈출
}
else {
	실행 구문; // 모든 조건식이 false일 때만 실행
}

  • switch 선택 제어문
    특정 위치로 이동시키는 것이 전부임
switch (점프 위치 변수) { // 점프 위치 변수 : 정수, 문자, 문자열 사용 가능
case 위칫값 1:
	실행 구문;
case 위칫값 2:
	실행 구문;
    .
    .
case 위칫값 n:
	실행 구문;
default: // 일치하는 위칫값이 없을 때 이 위치로 이동 (생략 가능)
	실행 구문;
}

1.1.2 반복 제어문

  • for 반복 제어문
    반복 횟수가 정해질 때, 실행 구문을 반복적으로 수행하는 반복 제어문
for (초기식; 조건식; 증감식) {
	실행 구문; // 조건식이 true인 동안 실행
}

# STEP 1 : 초기식 > 조건식 (참) > 실행 구문
# STEP 2 : 중괄호 닫힘 > 증감식 > 조건식 (참) > 실행 구문
    .
    .
# STEP 3 : 중괄호 닫힘 > 증감식 > 조건식 (거짓) > 종료

- 초기식 : for문이 시작될 때 딱 한 번 실행되고 다시는 실행되지 않음
          따라서 for문 안에서만 사용할 변수는 주로 초기식에서 초기화
* 초기식에 포함된 변수의 선언 위치 
for문의 내외부에서 선언 가능, 먼저 외부에서 변수를 선언하고 초기식에서 초기화만 했을 때 for문이 종료된 이후에도 변수는 사라지지 않음

- 조건식 : 실행 구문으로 들어가기 위한 유일한 출입구 , 이 조건식의 결과가 true 가 나오는 동안은 실행 구문을 계속 반복함
          민일 조건식이 false가 나오면 더 이상 반복을 수행하지 않고 for문을 빠져나감
* 조건식 생략 시 컴파일러는 자동으로 true 입력 > 무한루프
          
- 증감식 : for문의 실행 구문이 모두 수행된 후 닫힌 중괄호를 만나면 다음 번 반복을 위해 다시 이동하는 위치로 매회 반복이 수행할 때마다 호출됨
  • while 반복 제어문
    소괄호 안의 조건식이 true인 동안 중괄호 안의 실행 구문을 반복적으로 실행하는 반복 제어문
초기식; // 필수는 아니지만 대부분 사용 
* 중괄호 안에 넣을 경우, 매 반복마다 초기돼 원하지 않는 무한루프에 빠질 수 있음

while (조건식) { // 조건식 : while문으로 들어가는 유일한 입구 (생략 불가능)
	실행 구문;
    증감식;
}

# STEP 1 : 조건식 (참) > 실행 구문
# STEP 2 : 중괄호 닫힘 > 조건식 (참) > 실행 구문
    .
    .
# STEP 3 : 중괄호 닫힘 > 조건식 (거짓) > 종료
# for문과 while 문의 상호 변환

for (초기식; 조건식; 증감식) {
	살행 구문;
}

초기식;
while (조건식) {
	실행 구문;
    증감식;
}
  • do-while 반복 제어문
    while 문과 매우 유사하며 조건식의 검사와 반복 실행의 순서에만 차이가 있는 반복 제어문
초기식;
do {
	실행 구문; // 최초 1회는 무조건 실행
    증감식;
} while (조건식); // 문법 구조상 중괄호 존재 X > 세미콜론으로 끝남

# STEP 1 : 실행 구문
# STEP 2 : 조건식 (참) > 실행 구문
# STEP 3 : 조건식 (거짓) > 종료

1.2 제어 키워드

1.2.1 break 제어 키워드

if 문을 제외한 가장 가까운 중괄호를 탈출하는 제어 키워드

# 반복문 안에 if문과 함께 break가 사용된 예 

for (int i = 0; i < 10; i++) {
	if (i == 5) {
    	break;
    }
    System.out.println(i); // i = 0, 1, 2, 3, 4 일 때 출력
} // break 로 틸출하는 중괄호
# 레이블을 이용해 이중 for문 한 번에 탈출하는 예

out: // 레이블 위치 지정 (break 라고자 하는 반복문 앞에 레이블 표기)
for (int i = 0; i < 10; i++) {
	for (int j = 0; j < 10; j ++) {
    	if (j == 3)
        	break out; // out 레이블이 달린 반복문 탈출
        System.out.println(i + "," + j);
    }
} // break out으로 탈출하는 중괄호

1.2.2 continue 제어 키워드

반복 제어문의 닫힌 중괄호 역할을 하는 제어 키워드
반복 과정에서 특정 구문을 실행하지 않고 건너뛰고자 할 때 사용

# 반복문 안에 if문과 함께 continue가 사용된 예

for (int i = 0; i < 10; i++) {
	if (i == 5) { // if문으로 continue를 실행할 조건 설정
     	continue;
    }
    System.out.println(i); // 0, 1, 2, 3, 4, 6, 7, 8, 9
} // continue가 대체하는 중괄호


02 배열


2.1 배열

2.1.1 배열이란

  • 배열
    동일한 자료형을 묶어 저장하는 참조 자료형
    생성할 때 크기를 지정해야 하고, 한 번 크기를 지정하면 절대 변경할 수 없는 특징 지님

  • 배열의 길이

배열 참조 변수.length
  • 배열 출력
# 반복문을 이용한 1차원 배열의 값 출력

int[] a = new int[200];
a[0] = 1, a[1] = 2, .., a[99] = 100;

for (int i = 0; i < a.length; i++) {
	System.out.println(a[i]);
}
# for-each문
for (원소 자료형 변수명; 집합 객체) {
}

int[] a = new int[200];
a[0] = 1, a[1] = 2, .., a[99] = 100;

for (int k: a) {
	System.out.println(k);
}
# 1차원 배열의 모든 원소 값 출력

System.out.println(Arrays.toString(1차원 배열 참조 변수))
  • 참조 변수와 배열 객체의 값 초기화
int a = 0;
int[] b = null;

# 참조 자료형 변수는 실제 데이터의 위치를 저장하므로 초깃값으로 실제 데이터값이 아닌 '가리키고 있는 위치가 없음' 을 나타내는 null 사용
# 힙 메모리에서의 강제 초깃값

- 기본
boolean > false
byte, short/char, int, long > 0
float, double > 0.0

- 참조
클래스, 배열 > null

2.1.2 배열 생성

STEP 1 배열 선언

자료형[] 변수명 ex) int[] a;
자료형 변수명[] ex) int a[];

* 스택 메모리에 변수의 공간만 생성하고 공간 안은 비운 채로 둔 것

STEP 2 힙 메모리에 배열의 객체 생성

new 자료형[배열의 길이] ex) new int[3];

STEP 3 배열 자료형 변수에 객체 대입

# 한 번에 작성하기
자료형[] 변수명 = new 자료형[배열의 길이];
ex) int[] a = new int[3];

# 구분해 작성하기
자료형[] 변수명;
변수명 = new 자료형 [배열의 길이];
ex) int[] a;
	a = new int[3];
    
- int[] : int 배열 자료형
- a : 참조 변수
- new : 힙 메모리에 넣을 것 표기
- int[3] : int 자료형 3개를 저장할 수 있는 공간
* 객체의 위치를 참조 변수에 저장하는 이유

new  키워드를 이용해 객체를 생성하면 JVM은 힙 메모리 내에 비어 있는 공간에 객체 생성
힙 메모리에 비어 있는 공간은 매번 다를 것이므로 객체가 생성될 때마다 다른 위치에 저장될 수 있음

> JVM이 생성한 객채의 위치를 반드시 알아야 개발자가 해당 객체 사용 가능

STEP 4 객체에 값 대입

# 배열 객체 값 대입

참조 변수명[인덱스] = 값;
ex) int[] a = new int[3];

# 배열 객체 값 읽어오기
참조 변수명[인덱스];
ex) System.out.println(a[0]);

2.1.3 1차원 배열 생성

  • 배열 객체 생성 후 값 대입
자료형[] 참조 변수명 = new 자료형[배열의 길이];
참조 변수명[0] = 값;
      .
      .
참조 변수명[배열의 길이-1] = 값;
  • 배열 객체 생성과 함께 값 대입
자료형[] 참조 변수명 = new 자료형[]{값, 값 , . . , 값};

# 배열의 길이 지정 X > 배열의 길이는 값의 개수로 결정
# 선언과 객체 대입 분리 가능

int[] a = new int[]{3,4,5}; // (O)

int[] a;
a = new int[]{3,4,5}; // (O)
  • 대입할 값만 입력
자료형[] 참조 변수명 = {값, 값, . . , 값};
# 선언과 객체 대입 불가능

int a[] {3,4,5}; // (O)

int[] a;
a = {3,4,5}; // (X)

2.1.4 2차원 정방 행렬 배열

  • 배열 선언
- 자료형[][] 변수명
- 자료형 변수명[][]
- 자료형[] 변수명[]
  • 배열 객체를 생성하고 값 대입
자료형[][] 참조 변수명 = new 자료형[행의 길이][열의 길이];
참조 변수명[0][0] = 값;
      .
      .
참조 변수명[행의 길이 -1][열의 길이 -1] = 깂;
  • 배열 객체의 행 성분부터 생성하고 열 성분 생성하기
자료형[][] 참조 변수명 = new 자료형[행의 길이][]; // 열의 길이는 표시하지 않음

참조 변수명[0] = 1차원 배열의 생성;
참조 변수명[1] = 1차원 배열의 생성;
     .
     .
참조 변수명[행의 길이 -1] = 1차원 배열의 생성;
  • 배열의 자료형과 함께 대입할 값 입력하기
자료형[][] 참조 변수명 = new 자료형[][]{{값,값,. . , 값},. ., {값,값,. . ,값}};
  • 대입할 값만 입력하기
자료형[][] 참조 변수명 = {{값,값,. . , 값},. ., {값,값,. . ,값}};

 * 선언과 객체 대입 불가능

2.1.5 2차원 비정방 행렬 배열

각 행마다 열의 길이가 다른 2차원 배열

2차원 비정방 행렬 배열 생성

  • 배열 객체의 행 성분부터 생성하고 열 성분 생성하기
자료형[][] 참조 변수명 = new 자료형[행의 길이][]; // 열의 길이는 표시하지 않음
참조 변수명[0] = 1차원 배열의 생성;
참조 변수명[1] = 1차원 배열의 생성;
     .
     .
참조 변수명[행의 길이 -1] = 1차원 배열의 생성;
  • 자료형과 대입할 값만 입력하기
자료형[][] 참조 변수명 = new 자료형[][]{{값,값,. . ,값}, . . ,{값,값,. . ,값}}; 

// 배열의 길이는 신경쓰지 않음
  • 대입할 값만 입력하기
자료형[][] 참조 변수명 = {{값,값,. . ,값},. . ,{값,값,. . ,값}};

* 선언과 객체 대입 불가능

2차원 비정방 행렬 배열 출력

  • 이중 for문
int[][] a = {{1,2},{3,4,5}};

for(int i = 0; i < a.length; i++) {
	for(int j = 0; j < a[i].length; j++) {
    	System.out.println(a[i][j]);
    }
}
  • 이중 for-each문
int[][] a = {{1,2},{3,4,5}};

for(int[] m: a) {
	for (int n: m) {
    	System.out.println(n);
    }
}

2.1.6 main() 메서드의 입력매개변수

public static void main(String[] ar) {
}

// 여러 개의 String 객체를 묶어 저장하는 문자열 배열
# 타입 변환 메서드

- 문자열 > 정수 : Integer.parseInt (문자열)
- 문자열 > 실수 : Double.parseDouble (문자열)
- 정수 > 문자열 : String.valueOf (정수)
- 실수 > 문자열 : String.valueOf (실수)

2.2 문자열을 저장하는 String

2.2.1 문자열의 표현과 객체 생성

  • 표현
String a = "문자열"

* 반드시 큰따옴표 안에 표기할 것
  • 객체 생성
- String 참조 변수명 = new String("문자열")
- String 참조 변수명 = "문자열"

2.2.2 String 클래스의 2가지 특징

  • 객체 안의 값을 변경하면 새로운 객체를 생성
    String 객체는 내부에 포함된 문자열 변경 불가능
String str1 = new String("안녕"); 
* 스택 영역에 str1 생긴 것

String str2 = str1;
* 참조 자료형의 값을 복사하면 스택 메모리의 값이 복사

str1 = "안녕하세요";
* "안녕하세요" 라는 문자열을 포함하고 있는 새로운 String 객체 생성 > 이 위치를 str1 공간에 저장

System.out.println(str1);
System.out.println(str2);
* String 클래스의 특징과 배열의 특징 비교

String 클래스 : 값 변경 시 새로운 객체 생성 
배열 : 객체의 값 자체가 수정 > 참조 변수 복사 이후 하나의 변수에서 수정하면 나머지 변수에도 적용
  • 문자열 리터럴을 바로 입력해 객체를 생성할 때 같은 문자열끼리 객체 공유 > 메모리의 효율성 증대
String str1 = new String("안녕");
String str2 = "안녕";
String str3 = "안녕";
String str4 = new String("안녕");

* 문자열 리터럴로 생성할 때
힙 메모리에 리터럴로 생성된 동일 문자열을 포함하고 있는 개체가 있으면 그 객체를 공유

2.2.3 String 객체의 '+' 연산

  • '문자열+문자열' 연산
String str = "안녕" + "하세요" + "!";
               "안녕하세요"
                      "안녕하세요!"
                   
"안녕"/"하세요"/"!"/"안녕하세요"/"안녕하세요!"
위와 같이 객체가 5개 생성
  • '문자열+기본 자료형' 또는 '기본 자료형+문자열' 연산
기본 자료형 > 문자열 change

System.out.println(1+"안녕"); // 1안녕
  • String 클래스의 주요 메서드
- length() : 문자열의 길이 return
- charAt() : 문자열에서 특정 인덱스에 위치해 있는 문자을 알아냄
- indexOf() : 문자열에서 특정 문자나 특정 문자열을 앞에서부터 찾아 위칫값 알아냄
- lastIndexOf() : 문자열에서 특정 문자나 특정 문자열을 뒤에서부터 찾아 위칫값을 알아냄
- String.valueOf() : 기본 자료형을 문자열로 바꾸는 정적 메서드
- concat() : 2개의 문자열 연결 , 연산자와 동일한 기능 수행
- getBytes(): 문자열을 byte 배열로 반환, 자바 입출력 과정에서 주로 사용
- toCharArray() : 문자열을 char 배열로 변환, 자바 입출력 과정에서 주로 사용

- toLowerCase() : 영문 문자를 모두 소문자로 변환
- toUpperCase() : 영문 문자를 모두 대문자로 변환
- replace() : 일부 문자열을 다른 문자열로 대체
- substring() : 문자열의 일부만을 포함하는 새로운 문자열 객체 생성
- split() : 특정 기호를 기준으로 문자열 분리
- trim() : 문자열의 좌우 공백 제거
- equals() : 두 문자열의 위칫값이 아닌 실제 데이터값 비교, 이 때 대소문자 구분
- equalsIgnoreCase() : 두 문자열의 위칫값이 아닌 실제 데이터값을 비교하나 대소문자 구분 X


Java에서 제어문과 배열은 유용하게 쓰이므로 개념부터 꼼꼼하게 익혀두는 것이 좋음


0개의 댓글