나름 전공생이니 이부분은 한번 훑고만 넘어가기로 했는데 생각보다 오래걸림;;
02-1 변수
▶ 변수 작성 규칙
영어 대소문자를 구분함
첫문자는 소문자, 둘 이상 단어가 합쳐진 경우 뒤에 있는 단어의 첫 문자를 대문자로 하는게 관용
변수에 값을 대입(초기화)를 해야 변수가 메모리에 저장됨
선언만 하고 초기화하지 않은 경우엔 기본 값이 저장됨 (ex. int면 0, char이면 null 등)
▶ 변수 사용 범위
메소드 안에서 선언된 변수는
메소드 실행 이후 메모리에서 없어짐
=> 자신이 속한 블록 내부에서만 사용될 수 있음
02-2 기본 타입
cf. 여기서 리터럴은 다 '값 그 자체'를 의미한다고 보면 됨 (리터럴의 의미 = 변하지 않는 값)
ex. int a = 1; 에서 1이 리터럴
참고 : https://mommoo.tistory.com/14
▶ 정수 리터럴
int 변수에 2진수 등으로 값을 대입할 수도 있음
ex. 2진수는 0b로 시작 / 0b1001 == 9
((8진수, 16진수 등 많았는데 별로 안쓰는 것 같아 pass, 뭔지만 알아두면 될 듯))
▶ 문자 리터럴
작은 따옴표 하나로 감싼것은 유니코드로 변환되어 저장됨 -> 정수로 값 대입 & 사용 가능
ex. char var1 = 65; // var1에는 유니코드 'A'로 저장됨
int var2 = 'A'; // var2에는 65 저장됨
※ 많은 언어에서 작은 따옴표와 큰 따옴표를 구분없이 사용하지만, 자바에서는 에러남
' ' = char = 한 글자만 감쌀 수 있음
" " = String = 글자 여러개(문자열)를 감쌀 수 있음
Q. 왜 char은 소문자고 String은 대문자인가?
char은 기본 타입이고 String은 참조 타입(클래스 타입)이므로
문자열 출력에 \사용 복습
package sec02.exam06;
public class EscapeExample {
public static void main(String[] args) {
System.out.println("번호\t이름\t직업");
// /n이 ""를 벗어나면 에러 발생
System.out.print("행 단위 출력\n");
System.out.println("우리는 \"개발자\"입니다.");
System.out.println("봄\\여름\\가을\\겨울");
}
}
▶ 실수 타입
자바는 기본적으로 실수 타입을 double로 처리하므로 float 타입에 값을 저장하려면 실수 리터럴 뒤에 f 또는 F 를 붙여야 한다.
& 찾아본 결과 double이 정확도 측면에서 더 좋다고 한다.
특별한 이유가 없는 경우 다 double을 쓰면 됨
cf. double이라는 이름도 float보다 2배 정밀하다고 해서 붙여진 이름
▶ 실수 리터럴
e 또는 E가 포함된 숫자 리터럴은 10진수 '실수'로 인식함
(정수와 실수는 컴퓨터의 세계에서는 범위가 다르므로 다르게 취급한다.)
ex. double 5e2 = 5*10^2 = 500
ex. double 12E-2 = 12*0.1^2 = 0.12
ex. int 2e2 => e가 포함되어있으므로 200을 '실수'로 인식, 실수를 정수 변수에 저장하려므로 에러 발생
cf. but, 정수를 실수 변수에 저장하는 것은 가능 : 더 큰 그릇으로 옮겨담는 것 : 자동 타입변환
02-3 타입 변환
▶ 자동 타입 변환
작은 허용 범위의 타입이 큰 허용 범위의 타입으로 저장될 때 허용됨
작은 그릇의 물을 큰 그릇으로 옮긴다고 생각하면 됨
ex. 정수 -> 실수
기본 타입 허용 범위 :
byte < short < int < long < float < double
▶ 강제 타입 변환
큰 허용범위 값을 작은 허용범위 타입으로 저장할 때
큰 그릇의 물을 작은 그릇에 담으면 넘침 => 넘치는 부분 발생
※ 넘쳐서 자동으로 버려지는게 아니라 에러가 발생하기 때문에 반드시 처리해줘야 함!!!
자동으로 버려지겠지~🙄 => 자바에서는 안일한 생각😈
강제로 작은 그릇으로 옮겨담도록 표시를 해준 후에야 넘치는 부분이 버려지는 것
(변환하는 타입)으로 표시하면 됨
ex. double var1 = 3.14;
int var2 = (int) var1; // var2는 3
▶ 나눗기 연산
정수와 정수의 나누기는 자동으로 int로 처리하기 때문에 결과도 수학적으로는 실수이지만 정수가 나옴
따라서 피연산자 중 하나를 실수(double)로 만들어야 함
(둘 중 어느것이냐는 상관 x)
ex. System.out.println(5/2); // 2
System.out.println((double)5/2); // 2.5
▶ 문자열 to 기본 타입 형변환
기본 자료형끼리는, 자동 타입변환이나 (타입명)을 이용한 강제 타입변환을 했다.
하지만 문자열(클래스 타입) -> 기본 타입의 변환은
{클래스명}.parse{클래스명}(변수) 문법이 필요하다.
* 입력받은 숫자 처리할 때 많이 쓰임
ex. System.out.print("한국 돈 : ");
won = scanner.nextLine();
dollar = Integer.parseInt(won) * 1300;
System.out.println("미국 돈 : " + dollar);
▶ 기본 타입 to 문자열
String str = String.valueOf(기본 타입 값);
02-4 변수와 시스템 입출력
▶ 표준 입출력 장치
표준 입력 장치 : System.in (잘 안쓰임)
표준 출력 장치 : System.out
Q. 그냥 입력은 입력, 출력은 출력이라 하면되지, 왜 '표준' 입출력 '장치'라고 하는지 모르겠음
A. System 클래스에 대해 알아볼 필요가 있음!
- System 클래스란?
System 클래스는 자바 가상 머신(JVM)을 구성하는 '표준 장치'를 뜻하는 클래스이다.
=> 따라서 System.out을 표준 출력 장치라고 하는 것!
- 입출력에 System 클래스를 사용해야 하는 이유
자바 프로그램은 운영체제에서 실행되는 것이 아니라 JVM위에서 실행된다.
따라서 운영체제의 기능을 빌려써야 하는데, java.lang 패키지에 있는 System 클래스를 이용하면 운영체제의 일부 기능을 사용할 수 있다. 즉, System 클래스를 통해 키보드로부터 입력, 모니터로부터 출력이 가능한 것이다!
참고 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mals93&logNo=220722613149
입출력을 쉽게 이해하기 위한 설명
System. (시스템이 가지고 있는)
out. (표준 출력 장치로)
println (내용을 출력하고 행을 바꿔라)
== System.out.println
이때 out은 세가지 메서드를 제공함
println(내용) : 출력&줄바꿈
print(내용) : 출력
printf(내용) : 문자열을 형식에 맞춰 출력
▶printf
기본 형식 : System.out.printf("문자열 include %타입", %에 대입할 문자)
세부 형식 :
%[순번$][공백 채우는 방법][전체 자리수][.소숫점 자리수]형식문자 타입
%와 형식문자 타입을 제외한 것들은 모두 옵션임.
Ex. %2$04.2d = 2번째 변수, 공백은 0으로 채우기, 소수'점' 포함 전체 4자리수, 소숫점 이후 2자리, 실수
▶ 공백 채우는 방법
디폴트 : 왼쪽을 공백으로 둠 -> ' 2'
- : 오른쪽을 공백으로 둠 -> '2 '
0 : 공백을 0으로 채움 -> '0002'
▶ 전체 자리수
전체 자리수는 '정수 + .(소수점) + 소수점 이하 자리수'
소수점까지 전체 자리수에 포함하여 카운트 한다는 것 주의!
즉, printf("%04.1f", 2.1); 는 02.1이 됨
▶ 형식 문자 타입
%d : 십진수 정수 (decimal)
%f : 실수 (flaot)
%s : 문자열 (string)
%c : 문자 하나 (char)
※ d를 실수라고 헷갈리는 것 금지!
※ 개인적으로 헷갈렸던 부분
- printf 하면서 %를 안넣는 바보같은 실수했음 ㅠ
- printf는 줄바꿈 기능이 없으므로 \n 해줘야 함
- printf에서는 자동 형변환 안되는 듯 (정수 주면서 실수로 출력하라고 하면 안됨)
printf("%f",2); 하면 에러 발생
printf("%f",2.0); -> 정상 작동 - 파이썬과 다르게 문자열 출력이 , 로 연결 안되고 + 로만 연결됨
print("H","i"); -> 에러
print("H"+"i"); -> 정상 작동
그러므로 문자열 출력에 ,를 넣는 경우는 printf 밖에 없는 듯 - 설정한 소숫점 자리수보다 소수점 이하 자리수가 많은 소수를 출력하는 경우 반올림이 일어남
double value = 3.14159;
System.out.printf("%6.4f",value); //3.1416
▶ System.in.read();
키보드의 키 '하나'를 '숫자'로 읽을 수 있음
실제로 사용하려면 키코드(키보드에 대응하는 정수)를 외우고 있어야 하므로 실용성 ↓
System.in.read()가 실행되면
엔터를 누를 때까지 대기상태가 됨
엔터를 누르면 차례로 키코드를 읽음
이때 엔터는 두개의 키코드(13,10)로 읽히기 때문에 a,b,c, Enter를 누르면 최종적으로 97,98,99,13,10이 읽히게 됨
또한 2개 이상의 키로 구성된 한글도 읽을 수 없음 => 여러모로 비효율적 => Scanner 사용
▶ Scanner
문자열을 통으로 읽을 수 있는 클래스
'외부 클래스의 메소드를 사용하는 방법'은
0. 클래스가 있는 라이브러리 임포트
1. 클래스로부터 하나의 인스턴스 생성
2. 인스턴스 + . + 메소드 이름( );
이와 같은 방법으로 사용하면 됨
package sec04.exam01;
import java.util.Scanner; // 임포트
public class ScannerExample {
public static void main(String[] args) {
// 입력 값 저장할 변수
String text;
// Scanner 클래스의 인스턴스 scanner 생성
// 인자에 있는 System.in은 표준 입력장치에서 읽겠다는 의미
Scanner scanner = new Scanner(System.in);
while(true) {
// 키보드에서 읽는 메소드
text = scanner.nextLine();
System.out.println(text);
if(text.equals("q")) {
break;
}
}
System.out.println("종료");
}
}
▶ Scanner 메소드
scanner.next( ) : space를 만나기 전까지의 문자열을 읽는다.
scanner.nextLine( ) : Enter를 만나기 전까지의 문자열을 읽는다.
이때 누른 space와 엔터가 콘솔창에 반영되므로 예쁘게 출력하고 싶으면 이점을 주의하길!
Q. 아니 왜 자바에서는 문자열 비교할 때 ==를 안사용하고 .equals( ) 메소드를 사용하는거야?🤔
A. 기본 타입끼리 비교는 ==를 사용하지만, 문자열은 기본 타입이 아니라 클래스 타입이므로 String끼리 비교할 때는 equals( )를 사용한다.
Futher Study
>> 자바에서도 ==로 비교가 불가능한건 아니다. 하지만, ==를 이용해 '참조타입'인 String을 비교하게 되면, 참조하고 있는 두 주소가 같은지를 비교하게 된다. 참조하고 있는 주소가 다르다고 해서 값까지 다른 것은 아니므로, 값 자체는 동일하나 주소는 다르기 때문에 ==가 false가 나오는 오류가 발생할 수 있다. 따라서 주소가 아니라 값을 비교하는 .equals( )를 사용하는 것이다. ==는 주소비교, equals( )는 값 비교라고 외워두자.
[Java] 문자열 비교하기 == , equals() 의 차이점 (tistory.com)
'JAVA > 혼공자' 카테고리의 다른 글
[혼공자] Chapter 05-2 배열 (0) | 2022.07.23 |
---|---|
[혼공자] Chapter 05-1 참조 타입과 변수 (1) | 2022.07.23 |
[혼공자] Chapter 04. 조건문과 반복 (0) | 2022.07.21 |
[혼공자] Chapter 03. 연산자 (0) | 2022.07.21 |
[혼공자] Chapter 01. 자바 (1) | 2022.07.18 |