배열은 익히는게 쉽지가 않다.
어제부터 관련 글들도 많이 읽어보고 관련 알고리즘 문제들도 몇개 건드려 봤는데
생각만큼 쉽게 이해가 되지 않는거같다.
메모리 구조에 대해서는 어제는 많이 헷갈리는 부분이 많았는데
확실히 많이 보고 생각을 하다 보니 정리가 어느정도 된 것 같다.
기술매니저님께서 부분 부분 짚어주시며 이런 부분은 확실하게 알고 넘어가라고 하셨다.
- 변수의 선언과 초기화
- 변수의 저장되는 값의 범위
- 타입 변환 (자동 타입 변환 , 강제 타입 변환)
- 논리 연산자, 대입 연산자
- 조건문(if문, switch문)
- 반복문(for문, while문, do-while문)
- break/continue
- 배열
- 열거 타입
어제 조건문, 반복문, 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문같은 경우 별찍기로 조금 더 공부하자
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];
9.열거 타입
한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입
짧게 짧게 간단하게 정리하려 했는데
생각보다 길어졋다.
내가 이 내용들을 간단하게 정리할 만큼 머리에 정리가 안됐다고 생각하고 있다.
내일 하루 쉬는 동안 확실하게 정리를 해서 오늘보다 더 짧게 간단하게 새로 정리를 해야겠다.
오늘은 이렇게 끝.
20221112 개발일기 끝!
'개발 > 개발일기' 카테고리의 다른 글
20221114 미니프로젝트 -1 (0) | 2022.11.14 |
---|---|
20221113 - 항해99 pre-Onboarding - 7 (0) | 2022.11.13 |
20221111 - 항해99 pre-Onboarding - 5 (0) | 2022.11.11 |
20221110 - 항해99 pre-Onboarding - 4 (0) | 2022.11.10 |
20221109 - 항해99 pre-Onboarding - 3 (0) | 2022.11.09 |
댓글