본문 바로가기
개발/개발일기

20221112 - 항해99 pre-Onboarding - 6

by 전재경 2022. 11. 12.

 

배열은 익히는게 쉽지가 않다.

어제부터 관련 글들도 많이 읽어보고 관련 알고리즘 문제들도 몇개 건드려 봤는데

생각만큼 쉽게 이해가 되지 않는거같다.

 

메모리 구조에 대해서는 어제는 많이 헷갈리는 부분이 많았는데

확실히 많이 보고 생각을 하다 보니 정리가 어느정도 된 것 같다.

 

기술매니저님께서 부분 부분 짚어주시며 이런 부분은 확실하게 알고 넘어가라고 하셨다.

 

 

  1. 변수의 선언과 초기화
  2. 변수의 저장되는 값의 범위
  3. 타입 변환 (자동 타입 변환 , 강제 타입 변환)
  4. 논리 연산자, 대입 연산자
  5. 조건문(if문, switch문)
  6. 반복문(for문, while문, do-while문)
  7. break/continue
  8. 배열
  9. 열거 타입

 

어제 조건문, 반복문, break/continue, 배열, 열거 타입 공부를 했는데 솔직히 완벽하게 이해를 하고 넘어가진 못했다.

오늘 부족한 부분을 채우는 느낌으로 공부를 했는데 배열은 여전히 많이 헷갈린다.

 

약점을 알았으니 그래도 다행이다. 보완할 수 있으니

 

매니저님께서 강조하신 만큼 기초를 확실히 쌓고 넘어갈 수 있도록 하자.

 

오늘도 시간이 남았고 내일도 시간이 있으니 부지런히 정리를 해서 알고 넘어가자.

 


 

복습 및 정리글

 

1.변수의 선언과 초기화

// 변수 선언
String message1;

// 변수 초기화
message1 = "Hello World";

// 변수 선언 및 초기화
String message2 = "Hello World";

// 다중 변수 선언
String message1, message2;

 

2.변수의 저장되는 값의 범위

 

정수타입

타입 메모리 사용 크기 값의 범위
byte 1byte 8bit -128 ~ 127
short 2byte 16bit -32,768 ~ 32,767
char 2byte 16bit 0 ~ 65535(유니코드)
int 4byte 32bit -2,147,483,648 ~ 2,147,483,647
long 8bit 64bit -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

 

실수타입

타입 메모리 사용 크기 값의 범위
float 4byte 32bit 1.4E-45 ~ 3.4028235E38
double 8byte 64bit 4.9E-324 ~ 1.7976931348623157E308

 

논리타입

타입 메모리 사용 크기 값의 범위
 boolean 1byte 8bit true / false

 

 

3.타입 변환 (자동 타입 변환 , 강제 타입 변환)

 

자동 타입 변환(Promotion)

값의 허용 범위가 작은 타입이 큰 타입으로 저장될 때 발생
데이터가 다른 데이터 타입으로 자동으로 변환

큰 허용 범위 타입 = 작은 허용 범위 타입

byte < short < char < int < long < float < double

 

실수 연산

마찬가지로 피연산자 중 하나가 더 큰 범위를 갖는 경우 큰 범위의 타입으로 변환

int intValue = 7;
double doubleValue = 7.7;
double result = intValue + doubleValue; // 14.7

 

정수를 실수로

// 방법 1
int x = 1;
int y = 2;
double result = (double) x / y; // (1.0 / 2.0 = 0.5)
// 방법 2
int x = 1;
int y = 2;
double result = x / (double) y;
// 방법 2
int x = 1;
int y = 2;
double result = (double) x / (double) y;

 

char 타입은 하나의 문자를 저장할 수 있지만,
정확히는 유니코드의 값을 가지므로 정수와 연산을 수행
이 때, 연산 결과를 char 타입으로 강제 변환하면 유니코드 값을 문자로 출력

char charValue1 = 'A';
char charValue2 = 1;
int intValue1 = charValue1 + charValue2; // 66

char charValue3 = (char) intValue1; // B

 

강제 타입 변환(Casting)

큰 허용 범위 타입을 작은 허용 범위 타입으로 변환
이 때는 자동적으로 변환되지 않으므로 강제적으로 타입을 변환
캐스팅 연산자 괄호()를 사용

작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입

int 타입 → char 타입

int 타입이 더 큰 범위를 갖고 있으므로 강제로 타입을 변환해야 한다.
char 타입으로 강제 변환하면 정수값이 유니코드값으로 저장된다.

int intValue = 65;
char charValue = (char) intValue;
System.out.println(charValue); // A

실수 타입 → 정수 타입

실수 타입이 더 큰 범위를 갖고 있으므로 강제로 타입을 변환해야 한다.
소수점 이하 부분은 버려지고 정수 부분만 저장된다.

double doubleValue = 3.14;
int intValue = (int) doubleValue; // 3

문자열 → 기본 타입

String 타입을 기본 타입으로 변환하려면 강제로 타입을 변환해야 한다.
이 때, 캐스팅() 연산자가 아닌 자바가 제공하는 API 클래스를 사용한다.
API 클래스가 가지고 있는 메소드에 변환할 대상을 적어주면 된다.

 

변환 타입API 클래스사용 예

String → byte Byte.parseByte() String str = "10";
byte value = Byte.parseByte(str);
String → short Short.parseShort() String str = "10";
short value = Short.parseShort(str);
String → int Integer.parseInt() String str = "10";
int value = Integer.parseInt(str);
String → long Long.parseLong() String str = "10";
long value = Long.parseLong(str);
String → float Float.parseFloat() String str = "3.14";
float value = Float.parseFloat(str);
String → double Double.parseDouble() String str = "3.14";
double value = Double.parseDouble(str);
String → boolean Boolean.parseBoolean() String str = "true";
boolean value = Boolean.parseBoolean(str);

 

! 문자열 → 숫자열

문자열이 숫자가 아닌 요소를 포함하고 있을 때 타입 변환을 시도하면
숫자 형식 예외 NumberFormatException가 발생한다.

str = "7test";
int value = Integer.parseInt(str); // NumberFormatException 예외

 

기본 타입 → 문자열

기본 타입을 문자열로 변환하는 방법은 두 가지가 있다.

빈 문자열("") 결합
문자열과 숫자를 연산하면 결합 연산이 일어난다.
아무것도 입력하지 않은 빈 문자열와 숫자를 더하면 숫자는 문자열로 변환된다.

int value = 7;
String str = "" + 7; // "7"

 

String.valueOf() 메소드 사용

String.valueOf() 메소드를 사용하면 기본 타입을 문자열로 변환할 수 있다.

int value = 7;
String str = String.valueOf(value); // "7"

 

 

 

4.논리 연산자, 대입 연산자

 

논리 연산자

논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^), 논리 부정 연산(!)을 수행한다.

피연산자는 boolean 타입만 사용 가능

 

구분 연산식 결과 설명
AND
(논리곱)
true &&
또는
&
true true 피연산자 모두가 true일 경우에만 연산결과가
true
true false false
false true false
false false false
OR
(논리합)
true ||
또는
|
true true 피연산자 중 하나만 ture라도 연산 결과는
true
true false true
false true true
false false false
XOR
(베타적 논리합)
true ^ true flase 피연산자가 하나는 ture이고 다른 하나가
false일 경우에만 연산 결과가 true
true false true
false true true
false false false
NOT
(논리 부정)
  ! true false 피연산자의 논리값을 바꿈

 

대입 연산자

(=, +=, -=, *=, /=, %=)

대입 연산자는 오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 저장

오른쪽 피연산자에는 리터럴 및 변수, 다른 연산식이 올 수 있다.

구분 연산식 설명
복합 대입 연산자 변수 = 피연산자 오른쪽의 피연산자의 값을 왼쪽 변수에 저장
변수 += 피연산자 변수 = 변수 + 비연산자와 동일
변수 -= 피연산자 변수 = 변수 - 피연산자와 동일
변수 *= 피연산자 변수 = 변수 * 피연산자와 동일
변수 /= 피연산자 변수 = 변수 / 피연산자와 동일
변수 %= 피연산자 변수 = 변수 % 피연산자와 동일
변수 &= 피연산자 변수 = 변수 & 피연산자와 동일
변수 |= 피연산자 변수 = 변수 | 피연산자와 동일
변수 ^= 피연산자 변수 = 변수 ^ 피연산자와 동일

 

 

5.조건문(if문, switch문)

 

if문 , if-else문, if-else,if else 또는 else if

조건식에는 true이나 false를 산출하는 연산식이나, boolean 변수가 올 수 있습니다. 조건신이 true이면 블록을 실행하고 false이면 실행하지 않는 조건을 통해 코드 실행을 원하는 방향으로 제어

if(조건식1) { 
  실행문1;     // 조건식1이 true일 경우 실행
} 
else if(조건식2) {   
  실행문2;    // 조건식 1이 false이고 조건식2가 true일 경우 실행
} else{       
  실행문3;    // 조건식 1과 2가 true일 경우 실행
}
public static void main(String[] args) {
int num = (int) (Math.random() * 6) + 1;    
// 1 ~ 6에서 임의의 정수를 뽑는 Math.random() 메소드를 사용
	
	if (num == 1) {
		System.out.println("1번이 나왔습니다.");
	} 
	else if (num == 2) {
		System.out.println("2번이 나왔습니다.");
	} 
	else if (num == 3) {
		System.out.println("3번이 나왔습니다.");
	} 
	else if (num == 4) {
		System.out.println("4번이 나왔습니다.");
	}
	else if (num == 5) {
		System.out.println("5번이 나왔습니다.");
	} else {
		System.out.println("6번이 나왔습니다.");
	}
}

 

switch문

switch문은 if문과 같이 조건 제어문이다.

하지만 switch문은 true일 경우 실행문을 실행하는 것이 아닌, 변수가 어떤 값을 갖느냐에 따라 실행문이 선택

 

if문의 조건문의 결과가 true, false 2가지밖에 없기 때문에 경우의 수가 많아질수록 else-if를 반복적으로 추가해야 하므로 코드가 복잡, 하지만 switch문은 변수의 값에 따라 실행문이 결정되기에 if문 보다 코드가 간결

public class SwithchExample {
    public static void main(String[] args) {
        int num = (int) (Math.random() * 6) + 1;

        switch (num) {
            case 1:
                System.out.println("1번이 나왔습니다");
                break;
            case 2:
                System.out.println("2번이 나왔습니다");
                break;
            case 3:
                System.out.println("3번이 나왔습니다");
                break;
            case 4:
                System.out.println("4번이 나왔습니다");
                break;
            case 5:
                System.out.println("5번이 나왔습니다");
                break;
            case 6:
                System.out.println("6번이 나왔습니다");
                break;
        }
    }
}

 

 

6.반복문(for문, while문, do-while문)

 

for문과 while문은 서로 변환이 가능 (반복횟수를 알고 있을때는 for문, 조건에 따라 반복할때는 while문을 주로 사용)

while문과 do-while문의 차이는 조건을 먼저 검사하느냐 나중에 검사하느냐의 차이

 

for문

int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;
.
.
.
.
sum = sum + 100;
System.out.println("1~100의 합:" + sum);

 

위와 같은 덧셈 연산을 더 간단하게 작성하기 위해 for 문을 사용한다.

 

int sum = 0;
for (int i=1; i<=100; i++) {
	sum = sum + i;
}

System.out.println("1~100의 합 :" + sum);

 

다중 for문

for( int i = 0; i < 3; i++ ) {

    System.out.println("i = " + i);

    for( int j = i; j < 2; j++ ) {
    
        System.out.println("j = " + j);
        
    }
    
}

for문같은 경우 별찍기로 조금 더 공부하자

 

[Java]별 찍기 피라미드

반복문에서 가장 기본적으로 배우는게 별찍기 일것이다. 가장 기본적인 1. 삼각형 모양의 별찍기 public class Main { public static void main(String[] args) { for (int i = 1; i < 6; i++) { for (int j = 0; j < i; j++) { System

jkadv.tistory.com

 

While문

true일 경우 반복, false일 경우 종료

int i = 1;
int sum = 0;
while (i <= 10) {
    sum += i;
    i++;
}
System.out.println(sum);

 

do-while문

int i = 1;
int sum = 0;

do {
    sum += i;
    i++;
} while (i <= 10);
System.out.println(sum);

 

향상된 for문

배열에서 사용

int intArray[] = {1, 2, 3, 4, 5}; 
		
// for(데이터타입 변수명 : 배열명)
for(int number : intArray) {
// 배열의 길이만큼 number를 반복하기 때문에 배열의 모든 요소가 출력된다.

 

7.break/continue

 

Break

break문은 반복문인 for문, while문, do-while문의 실행을 중지 할때 사용

switch문에서도 break문을 사용하여 종료

public class BreakExample {
    public static void main(String[] args) {
    Outter : for(char upper='A'; upper <= 'Z'; upper++){
        for(char lower='a'; lower<= 'z'; lower++){
            System.out.println(upper + "-" + lower);
            if(lower == 'g'){
                break Outter;
            }
        }
    }
    
    system.out.println("프로그램 실행 종료");
    }
    
}

 

Continue

continue 문은 반복문을 종료하지않고 계속 반복을 수행한다는 점이 break문과 다릅니다.

break문과 마찬가지로 continue 문도 대개 if문과 같이 사용되는데, 특정 조건을 만족하는 경우에 continue문을 실행해서 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어갑니다.

public class ContinueExample {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            if (i % 2 != 0) {
                continue;
            }
            System.out.println(i);
        }

    }
}

 

8.배열

동일한 자료형으로 선언된 데이터 공간을 메모리 상에 연속적으로 나열하여 데이터 관리의 효율성을 높이는 것

변수는 한개의 데이터만 저장할 수 있다.

따라서 저장해야 할 데이터의 수가 많아지면 그만큼 많은 양의 변수를 선언해줘야하는 비효율성이 발생.

그렇기에 좀 더 효율적인 방법이 필요한데 이것이 배열이다.

배열은 같은 타입의 데이터를 연속된 공간에 나열시키고 각 데이터에 인덱스(index)를 부여해 놓은 자료구조

// 각각의 변수로 선언
int a1, a2, a3, a4, a5;

// 5개의 int 값을 저장할 수 있는 배열 생성
int[] a = new int[5];

 

 

[Java]배열(Array) 선언 및 초기화,복사

배열이란 ? 동일한 자료형으로 선언된 데이터 공간을 메모리 상에 연속적으로 나열하여 데이터 관리의 효율성을 높이는 것 변수는 한개의 데이터만 저장할 수 있다. 따라서 저장해야 할 데이터

jkadv.tistory.com

 

 

9.열거 타입

한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입

 

 

[Java]열거 타입

열거 타입 한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입 여기서 Week이 열거 타입이다. Week로 다음과 같이 변수를 선언할 수 있다. Week today; today 변수에 저장할 수 있는 것은 Week에

jkadv.tistory.com

 

 

짧게 짧게 간단하게 정리하려 했는데

생각보다 길어졋다.

내가 이 내용들을 간단하게 정리할 만큼 머리에 정리가 안됐다고 생각하고 있다.

 

내일 하루 쉬는 동안 확실하게 정리를 해서 오늘보다 더 짧게 간단하게 새로 정리를 해야겠다.

오늘은 이렇게 끝.

 

20221112 개발일기 끝!

댓글