[혼공자][week1] Day2 변수가 뭐길래... (추가숙제 포함)

Ida·2025년 1월 12일
0

혼공자

목록 보기
2/20

타입변환이 헷갈리니 더욱 공부 필요!

02-1 변수

변수

  • 값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름
  • 특정 번지에 값을 저장하고 읽을 수 있음
  • 하나의 변수에 하나의 값만 저장 가능

1. 변수 선언

int x;
int y;
int z;

혹은

int x, y, z
  • 변수 사용을 위해서 꼭 해야 함.
  • 변수 타입(변수에 저장되는 값의 종류와 범위)과 변수 이름 결정
  • 같은 타입의 변수
변수이름 작성 규칙
  1. 첫 번째 글자는 문자, '$', '_' 가능, 숫자와 특수문자는 불가능 (필수)
  2. 영어 대소문자 구분 (필수)
  3. 첫 문자 영어 소문자 시작하되, 다른 단어가 붙으면 첫 문자는 대문자로 함(관례)
  4. 문자 길이 제한 X
  5. 자바 예약어 사용 X
    *자바 예약어: 이미 해당 프로그래밍 언어에서 사용되고 있는 단어. 변수 이름 지정 불가능함. 만약 사용한다면 컴파일 에러 발생
  6. 쉽게 알 수 있는 의미 있는 이름으로 지을 것. 한글 포함 안 하는게 좋음.

2. 값 저장

  • 변수에 값이 저장되지 않으면 변수 생성 X
  • 대입연산자(=)으로 변수에 값 저장
  • 변수 초기화: 변수에 최초로 값이 저장될 때 변수 생성 되는 것. 메모리 번지 정보 가지고 값이 저장됨

정수형 변수 'score'선언하고 초기값은 80

int score;		// 변수 선언
score = 80;		// 값 저장

변수 선언 동시에 초기값 저장 가능

int score = 80;
  • 초기화 되지 않은 변수는 컴파일 에러 발생
/* 잘못된 코딩 예시 */

int value;					// 변수 선언
int result = value + 10;	// 변수 value 값을 읽고 10 더해서 변수 result에 저장
변수 선언은 되었으나 초기화 되지 않았음. value 변수 존재하지 않음. 컴파일 에러 발생
/* 올바른 코딩 예시 */

int value = 30;					// 변수 value에 30으로 변수 초기화
int result = value + 10;		// 변수 value 값 30을 읽고 10을 더해서 변수 result에 저장
변수 초기화 손코딩

변수 초기화를 하지 않아 12라인에서 컴파일 에러(The local variable value may not have been initialized) 발생
변수 초기화 안 했을 때 오류
변수 초기화 후 컴파일하고 실행
변수 초기화 했을때

3. 변수사용

  • 변수 사용 예시
//변수 hour와 minute에 각각 3과 5 저장
int hour = 3;
int minute = 5;

System.out. println(hour + "시간" + minute + "분")

Console: 3시간 5분

  • 산술 연산에 변수 사용한 연산 수행 과정
int totalMinute = (hour * 60) + minute;
  1. 변수 hour에 저장된 값으로 대체
    int totalMinute = (3 * 60) + minute;

  2. 변수 minute에 저장된 값으로 대체
    int totalMinute = 180 + 5;

  3. 산술된 값을 변수 totalMinute에 저장
    int totalMinute = 185;

산술 연산식 변수 사용 손코딩

손코딩

변수 값 교환(값 복사) 손코딩

변수 값 복사

4. 변수 사용 범위

  • 로컬변수: {} 메소드 블록 내부에 선언된 변수.
  • 변수는 선언된 위치부터 자신이 속한 블록 내부에서만 사용 가능
  • 메소드 블록 내 다른 {} 중괄호 블록 내에서 선언된 변수는 해당 {} 중괄호 블록 내에서만 사용 가능 (어길 시 컴파일 오류 발생)
public static void main(String[] args) {
	int var1;				//메소드 블록 내 선언
    if( ) {
     int var2;				//if 블록 내 선언
     //사용 가능: var1, var2
 	}
    
    for( ) {
     int var 3;				//for 블록 내 선언
     //사용 가능: var1, var3
     //var2 사용 불가능
     }
     
     //사용 가능: var1
     //사용 불가능: var2, var3
     

변수 사용 범위 손코딩

  • 변수 사용 범위를 잘못하여 v2 변수 사용 X
  • 해당 컴파일 에러 메시지: v2 cannot be resolved to a variable
    변수 잘못된 범위 사용

02-2 기본 타입

기본타입: 정수, 실수, 논리값을 저장할 수 있음

  • 정수 타입: byte, char, short, int, long
  • 실수 타입: float, double
  • 논리 타입: boolean

1. 정수타입

  • 각 타입별 메모리 사용 크기 익혀두기
  • char 타입은 문자 코드라 음수 값을 가질 수 없음.
  • 정수 타입으로 선언된 변수는 정수 리터럴을 대입해서 정수 저장 가능

정수 리터럴

소스 코드에서 프로그래머에 의해 직접 입력된 값. 자바가 정수로 인식하는 경우 ⇣

  • 2진수: 0b or 0B로 시작, 0과 1로 구성
    0b1011 -> 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 -> 11
    0b10100 -> 20

  • 8진수: 0으로 시작하고 숫자 0~7로 구성
    013 -> 11
    0206 -> 134

  • 10진수: 소수점이 없는 숫자 0~9로 구성
    11
    365

  • 16진수: 0x or 0X로 시작, 숫자 0~9와 A, B, C, D, E, F or a, b, c, d, e, f로 구성
    0xB3 -> 179
    0x2A0F -> 10767

정수 리터럴을 변수에 저장하고 10진수로 출력 (손코딩)

  • int 타입 변수에 정수 리터럴 저장 후 10진수로 출력
    정수 리터럴

byte 타입

byte 타입 변수 허용 범위 초과 컴파일 오류 (손코딩)

  • byte 타입값 허용 범위는 '-128 ~ 127', 11라인은 허용 범위를 초과하여 Type mismatch: cannot convert from int to byte오류 발생
    byte 타입 변수

long 타입

  • 수치 큰 데이터 다루는 프로그램에서 주로 사용됨. (ex. 은행, 과학 등)
  • 컴파일러는 정수 리터럴을 int 타입으로 간주함. 허용 범위를 초과할 경우 long 타입으로 알려줘야 함.
  • 정수 리터럴 뒤에 l, L 붙이면 컴파일러가 long 타입으로 인식함.
    long balance = 30000000000; ⇠ 컴파일 에러(int 허용 범위 초과)
    long balance = 30000000000L;

long타입변수 (손코딩)

long타입변수

char 타입

  • 문자 리터럴: 하나의 문자를 작은따옴표로 감싼 것. 유니코드로 변환되어 저장됨
  • 10진수 or 16진수 형태로 유니코드 저장 가능
  • int 타입 변수에 문자를 저장하면 유니코드가 출력됨.
    문자 리터럴 int에 저장

char타입변수 (손코딩)

char타입

String 타입

  • 작은따옴표로 감싼 문자는 char 타입에 저장하면 유니코드로 저장됨.
  • 큰따옴표로 감싼 문자 or 여러 문자들 즉, 문자열은 유니코드 변환 x
  • 잘못된 코딩 ⇢ 올바른 코딩
    char var1 = "A"String var1 = "A";
    char var2 = "홍길동"String var2 = "홍길동";
  • 문자 리터럴: 작은따옴표 / 문자열 리터럴: 큰따옴표

String타입 (손코딩)

이스케이프 문자

  • 문자열 내부에 특정 문자 포함을 위해 역슬래시를 사용한 문자
  • 출력 제어 가능: 탭만큼 띄우기(\t), 개행(\n) 등
  • \t(탭만큼 띄움), \n(줄 바꿈), \r(캐리지리턴), \"("출력), \'('출력), \\ (\출력), \u16진수(16진수 유니코드에 해당하는 문자 출력)
String str = "나는 \"자바\"를 좋아합니다.";
System.out.println(str);

나는 "자바"를 좋아합니다.

  • \t로 탭만큼 띄우기
String str = "번호\t이름\t나이";
System.out.println(str);

번호 이름 나이

  • \n\으로 개행
String str = "홍길동\n감자바";

홍길동
김자바

  • 이스케이프 문자 출력 (손코딩)

2. 실수 타입

  • 소수점이 있는 실수 리터럴 저장 가능
  • float, double
  • 소수점이 있는 숫자 리터럴은 10진수 실수로 인식
  • 알파벳 소문자 e or 대문자 E가 포함된 숫자 리터럴은 지수와 기수로 표현된 소수점이 있는 10진수 실수로 인식
  • 자바는 실수 리터럴을 double 타입으로 해석해서 저장도 double 타입 변수에 저장
  • float 타입 저장시엔 실수 리터럴 뒤에 소문자 f or 대문자 F 붙여야 됨. (그렇지 않으면 컴파일 에러 발생)
  • 허용하는 소수점 이하자리: float(7자리), double(15자리)
  • double이 float보다 2배 정도 정밀도가 높음₩

float과 double 타입 (손코딩)

FloatDouble

3. 논리 타입

  • 논리 리터럴: true(참), false(거짓)
  • boolean 타입 변수에 저장
  • 조건문과 제어문의 실행 흐름 변경에 사용됨

boolean타입 (손코딩)

boolean 타입

02-3 타입 변환

  • 변수 a에 저장된 값을 변수 b로 복사
byte a = 10;
int b = a;

1. 자동 타입 변환

  • 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생함.
  • 기본 타입의 허용 범위 크기순
    byte < short < int < long < float < double
  • 예외:
    byte 타입은 char 타입으로 자동 타입 변환 안됨.
    이유는 char 타입의 허용 범위는 음수 미포함
    , byte 타입은 음수 포함.

자동 타입 변환 (손코딩)

자동타입변환

2. 강제 타입 변환(캐스팅)

  • 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것.

  • 캐스팅 연산자 괄호() 사용.

  • int -> char은 문자 출력할 수 있음

  • 실수타입 -> 정수타입은 소수점 이하 부분 버리고 정수 부분만 저장됨.

    강제타입변환 (손코딩)

    강제 타입 변환

    3. 정수 연산에서의 자동 타입 변환

  • 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int타입보다 작은 타입의 변수는 int타입으로 자동 타입 변환되어 연산 수행

  • byte 변수가 피연산자로 사용되면 int 타입으로 변환되어 연산됨. 연산 결과는 int 변수저장해야 함. (byte 변수에 연산 결과 저장시 컴파일 에러 발생)

    정수 타입의 연산 (손코딩)

    정수 자동타입변환

허용 범위가 더 큰 타입으로 자동타입변환 (손코딩)

long 자동타입변환

4. 실수 연산에서의 자동 타입 변환

  • int와 double의 연산이면 double 타입으로 연산 되기 때문에 변수 저장 시에도 double 타입으로 저장
  • int와 double의 연산에서 꼭 int 타입으로 계산 해야 한다면 double 타입을 int 타입으로 강제 변환해야 함.
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue;

결과: result에 15 저장됨.

정수, 실수 타입변환종합 (손코딩)

5. + 연산에서의 문자열 자동 타입 변환

  • 피연산자 중 하나가 문자열이면 나머지 피연산자도 문자열로 자동 변환하여 문자열 결합 연산 수행됨.
숫자 + 숫자 -> 덧셈 연산 => 숫자
숫자 + "문자열" -> "숫자" + "문자열" => "숫자문자열"
숫자 + "문자열" + 숫자 -> "숫자" + "문자열" + 숫자 -> "숫자" + "문자열" + "숫지" => "숫자문자열숫자"
"문자열" + 숫자 + 숫자 -> "문자열" + "숫자" + 숫자 -> "문자열" + "숫자" + "숫자" => "문자열숫자숫자"
  • 우선 연산을 하고 싶은 경우 괄호()이용

+ 연산 문자열 자동타입변환 (손코딩)

+연산 자동타입변환

6. 문자열을 기본 타입으로 강제 타입 변환

  • 문자열 -> 기본타입
  • [기본타입].parse[기본타입]([문자열];
// String -> byte
String str = "10";
byte value = Byte.parseByte(str);

// String -> short
String str = "200";
short value = Short.parseShort(str);
  • 문자열에 숫자 외에 다른 것이 포함될 경우 숫자 타입 변환 시 에러 방생(숫자 형식 예외, NumberFormatException)
  • 기본타입 -> 문자열, String.valueOf() 메소드 사용
    String.valueOf(3) -> 문자열 "3"

기본타입과 문자열의 타입변환 (손코딩)

기본타입 문자열 타입변환

👾추가숙제 확인문제 9번

9. var1부터 var4까지 +연산을 수행해서 int 타입 result 변수에 9가 저장되도록 ____에 들어갈 코드를 작성해보세요.

long var1 = 2L;
float var2 = 1.8f;
double var3 = 2.5;
String var4 = "3.9";
int result = ____;
System.out.println(result);

2-03 9번

profile
나는 이다이다.

0개의 댓글

관련 채용 정보