[혼공자]2주차정리

박수연·2025년 7월 13일
0

[혼공자]

목록 보기
2/7

04 조건문과 반복문

04-1 조건문: if문, switch 문

if문

if(조건식){
   실행문A
}
실행문B
  • 조건식이 true → 실행문 A 실행 → 실행문 B 실행
  • 조건식이 false → 실행문 B 실행
  • 실행문 A에 들어갈 실행문이 하나밖에 없으면 생략, but 가독성이나 해석의 용이성을을 위해 생략 X

if-else 문

if(조건식){
   실행문A
}else{
   실행문B
} 실행문C
  • 조건식 true → 실행문 A 실행 → 실행문 C실행
  • 조건식 false → 실행문 B실행 → 실행문 C실행

if-else if-else 문

if(조건식1){
   실행문A
}else if(조건식2){
   실행문B
}else{
   실행문C
}
   실행문D
  • 조건식 1 true → 실행문 A 실행 → 실행문 D실행
  • 조건식 1 false → 조건식 2 이동
  • 조건식 2 true → 실행문 B실행 → 실행문 D실행
  • 조건식 2 false → 실행문 c실행 → 실행문 D실행

switch 문

switch(변수){
  case 값1 :
    실행문A
    break;
  case 값2 :
    실행문B
    break;
    .
    .
    .
  default :
    실행문C
}
  • 변수의 값이 해당하는 case로 이동하여 해당 실행문을 실행
  • 변수의 값이 case의 값에 해당하지 않을때 default의 실행문을 실행(defaut는 생략가능)
  • 실행문 마지막에 break를 작성하지 않으면 다음 case의 값에 상관없이 실행문이 실행된다.

04-2 반복문: for문, while문, do-wile문

for문

for(초기화식;조건식;증감식){
    실행문
}
  • 초기화식 실행 → 조건식이 true이면 for문 내부 실행문 실행 → 증감식 실행 → 조건식평가 → 조 건식 true 이면 실행문실행 → 조 건문 false 일때까지 반복
  • 조건식 false 일 경우 실행 문을 실행하지 않고 for문 종료

*주의할점
초기화식에서 선언된 변수는 로컬변수. For문 안에 서만 사용.
초기화식에서 루프카운터변수는 float을 사용하지 않는다.

중첩 for문

  • For 문안에 for 문이 있는 것.
  • 바깥쪽 for 문을 실행하다가 안쪽 for 문을만나면 안쪽 for 문을 돌고 다시 바깥쪽 for 문 으로 돌아간다

while 문

while(조건식){
    실행문
}
  • 조건식이 t rue인 경우 계속 반복
  • 조건식이 false가 되면 반복을 멈추고 while문 종료
  • 조건식 평가 → true → 실행문실행 → 조건문 평가 → true → 실행문 실행→…→ 조건문평가
    → false → while 문 종료

do-while문

do{
    실행문
}while(조건식);
  • 실행문 우선 실행
  • 조건식 평가 → true → 실행문실행 → 조건식평가 →....→ 조건식 false → do while문 종료

break문

  • break문은 조건문, 반복문의 실행을 중지시킬 때 사용
  • 중첩문일때 바깥쪽 조건문이나 반복문 앞에 Label : 을 붙이고 break Label;이라고 작성하면 바깥쪽 중첩문까지 중지

continue문

  • 반복문 내부에서 continue를 만나면 for문의 증감식, while do-while문에서는 조건식으로 이동 후 계속 진행

05 참조 타입

05-1 참조 타입과 참조 변수

  • 타입 : 기본 타입 - 정수, 실수, 문자, 논리 리터럴
            참조 타입 - 배열, 열거, 클래스, 인터페이스

기본타입과 참조 타입

  • 차이점 : 저장되는 값이 다름
  • 기본타입은 실제 값을 변수 안에 저장하지만 참조 타입은 메모리의 번지를 변수에 저장
  • 참조 타입에서 실제 값은 메모리에 저장되어 있고 변수에는 메모리의 번지를 저장하여 참조한다는 의미

메모리 사용 영역

메소드 영역

  • JVM이 시작될때 생성되고 모든 스레드가 공유하는 영역
  • 클래스 로더로 읽어 정적필드, 상수, 메소드 코드, 생성자 등을 분류해 저장

힙 영역

  • 객체와 배열이 생성되는 영역
  • JVM 스택 영역의 변수나 다른 객체의 필드에서 참조
  • 여기에 참조하는 변수나 객체가 없으면 JVM이 이를 쓰레기 취급하고 자동으로 제거(별도의 제거 코드 필요x)

JVM 스택 영역

  • 메소드를 호출할 때마다 프레임 추가, 메소드 종료되면 프레임 제거
  • 생성된 변수는 초기화 될 때 스택에 추가
  • 로컬변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 제거됨

참조 변수의 ==, != 연산

  • 기본 타입 변수의 ==, != 연산은 값이 같은지 아닌지를 조사
  • 참조 타입 변수의 ==, != 연산은 동일한 객체를 참조했는지 아닌지 조사

null과 NullPointerException

  • null : 힙 영역의 객체를 참조하지 않는다는 의미, null을 초기값으로 사용 가능
  • 예외 : 프로그램 실행 도중 발생하는 오류
  • 참조 변수가 null을 가질 경우 참조 객체가 없으므로 데이터나 메소드를 사용할 수 없어 NullPointException이 발생

String 타입

  • 큰 따옴표로 감싼 문자열 리터럴 객체를 참조한다
  • 동일한 문자열 리터럴을 참조할 경우 동일한 객체를 참조한다
  • new 연산자 : 객체 생성 연산자, 힙 영역에 새로운 객체를 만들 때 사용하는 연산자
  • new 연산자로 객체를 생성하면 동일한 문자열이라도 다른 객체가 된다(==연산 결과 false)

String name1 = "신용권";
String name2 = "신용권";
String name3 = new String("신용권")

  • name1 == name2 의 결과는 true
  • name1 == name3 또는 name2 == name3 의 결과는 false
  • 문자열이 같은지만 비교하려면 .equals() 사용

05-2 배열

배열이란?

  • 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여한 자료구조
    <score배열>

    값→ 83 90 87 93 78 ... 75
    인덱스→ 0 1 2 3 4 ... 29
  • 위 score배열에서 각 항목의 데이터는 score[인덱스]로 접근

※ 배열의 특징

  • 배열은 같은 타입의 데이터만 저장 할 수 있다
  • 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다

배열 선언

  • int[] intArray; 타입[ ] 변수;
  • int intArray[]; 타입 변수[ ];

배열 생성

값 목록으로 배열 생성

  • 타입[ ] 변수 = {값0, 값1, 값2, 값3, …};
  • 이미 생성된 배열의 값을 바꾸고 싶을때는 대입연산자를 이용
    String[] names = {"신용권", "홍길동", "감자바"};
    names[1]="홍삼원"; ← 이렇게 하면 배열의 값을 바꿀 수 있음
    names = {"신용권", "홍삼원", "감자바"}; ←바꾼 이후의 배열

new 연산자로 배열 생성

  • 타입[] 변수 = new 타입[길이];
  • 타입[] 변수 = null;
    변수 = new 타입[길이];

배열 길이

  • 배열 변수.length;
    int [] intArray = {10, 20, 30};
    int num = intArra.length;
  • 위와 같이 사용 가능, for문에서 배열 전체를 돌때 우용하게 사용 가능
  • for문에서 인덱스를 초과해서 사용하면 ArrayIndexOutOfBoundsException 발생

명령 라인 입력

  • 메인 메소드에서 String[] args는 실행인자 전달용

다차원 배열

  • n * m 의 행렬 형태
    int[][] intArray = new int[2][3];
    (0,0) (0,1) (0,2)
    (1,0) (1,1) (1,2)

intArray.length ← 2 intArray의 길이
intArray[0].length ←3 intArray[0]의 길이
intArray[1].length ←3 intArray[1]의 길이

객체를 참조하는 배열

String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");

  • strArray[0] == strArray[1] →true
  • strArray[0] == strArray[2] →false
  • strArray[0].equals(strArray[2]) →true

배열 복사

  • 배열을 복사하기 위해서는 for문 또는 System.arraycopy() 메소드 사용
  • for문 사용
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
for(int i=0; i<oldIntArray.length; i++){
	newIntArray[i] = oldIntArray[i];
}
  • System.arraycopy(원본 배열, 원본배열의 시작 인덱스, 새 배열, 새 배열의 시작 인덱스, 복사할 개수) 메소드 사용
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
System.arraycopy(oldIntArray, 0, newIntArray, 0, oldIntArray.length);

향상된 for문

for(타입 변수 : 배열) {
	실행문
}
  • for문에서 가져올 첫번째 값 존재 여부 확인
  • 값이 존재하면 변수에 값 저장
  • 실행문 실행
  • 값이 없을때 까지 반복 후 종료

05-3 열거 타입

  • 열거 상수 중에 하나의 상수를 저장하는 타입
public enum Week {
MONDAY, TUESDAY, WEDNSDAY, THURSDAY FRIDAY, SATURDAY, SUNDAY
}
Week today;
today = Week.FRIDAY;
  • 이 예제에서 Week가 열거타입, Week 안에 있는 요일들이 열거 상수

열거 타입 선언

  • 열거 타입 이름의 소스파일(java파일)이 있어야 함
  • 첫글자는 대문자(관례)
    public enum 열거타입 이름 {...};

열거 타입 변수

  • 선언 방법
    열거타입 변수;
    열거타입 변수 = 열거타입.열거상수;

과제

  • 기본과제
둘째주 느낀점 : 이번에는 한글이 깨져 나와서 고생을 많이 했다. 분명 이전에도 겪었던 일이었을텐데 매번 같은 문제로 해메고 있다. 언제쯤 능숙하게 문제가 슉슉 해결하게 될까? 아직은 조금만 찾아보면 금방 해결할 문제라 괜찮지만 점점 더 어려운 문제가 생길텐데 그땐 어떻게 해결할지 벌써부터 걱정이다 아직은 도움 줄 사람들도 많고 금방 해결할 문제들이니 차분히 생각하면서 하나씩 해결해보자

0개의 댓글