2022-11-07 (월)
source file(소스파일): 프로그래밍 언어로 작성한 파일
compile(컴파일)= 0과 1로 이루어진 기계어 파일로 번역해줌
자바로 작성된 프로그램은 모두 운영체제에서 실행가능
-> 윈도우에서 개발된 프로그램을 수정하지 않고 바로 리눅스에서도 실행할수 있는 장점
객체지향 프로그래밍(OOP):객체(부품)를 만들고, 이 객체들을 서로 연결해서 더 큰 프로그램을 완성하는 기법
① 소스파일(~.java)을 작성한다.
② javac 명령어로 컴파일한다.
③ java 명령어로 실행한다.
④ 실행결과를 확인한다.
-명령프롬프트(cmd)에서 컴파일하고 실행하기-
javac -d[바이트 코드 파일 저장위치][소스경로/module-info.java 소스 경로/*java]
바이트코드는(ex)Hello.clss지만 java명령어로 실행할 때는 .class를 생략한다.
-> java -p [바이트코드 파일 저장 위치][패키지이름...클래스이름]
변수: 값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름
자바의 변수는 다양한 타입의 값을 저장할 수 없다.
변수이름은 자바 언어에서 정한 '명명규칙'을 따라야 하고, 예약어는 사용할 수 없음.(혼공자_자바 p.49)
예약어:class, if, else, null, int, float 등
값 저장 -> 대입연산자(=)를 사용. 수학에서는 '='는 '같다'의 의미지만 자바언어에서는 오른쪽값을 왼쪽의 변수에 저장한다는 의미 !
ex) int score; (//변수선언)
score = 90; (//90을 score에 저장, 변수초기화, 90=초기값이 됨)
꼭 변수에 값을 저장해주어야함. 변수에 최초로 값이 저장될 때 변수가 생성되며, 이것을 '변수초기화'라고 함. 이때 사용된 값을 초기값 이라고 함.
자바가 제공하는 기본 타입(총 8개) : 정수타입, 실수타입, 논리타입
정수타입 - byte, char, short, int, long
실수타입 - float, double
논리타입 - boolean
기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주한다. int의 허용범위를 초과할 경우 long 타입을 사용해야하는데 이 때, 정수 리터럴 뒤에 대문자L을 사용하여 long타입임을 컴파일러에게 알려주어야한다.
long balance = 300000000000; (에러)
long balance = 300000000000L; (정답)
문자리터럴 : 하나의 문자를 작은 따옴표(')로 감싼 것, 유니코드로 변환되어 저장
예를 들어, 'A', 'B', '가', '각' 문자를 char 변수에 저장할 경우 변수에 저장되는 유니코드 값은 다음과 같다.
char var1 = 'A'; //유니코드 65
char var3 = '가'; //유니코드 44032
또한, 유니코드는 정수이므로 char도 정수타입에 속한다. 그래서 작은따옴표(')로 감싼 문자가 아니라, 10진수 또는 16진수 형태로 유니코드를 저장할 수 있다.
char c = 65;
char c = 0x0041;
*작은따옴표(')로 감싼 문자 리터럴은 유니코드로 변환되기 때문에 int 타입 변수에도 저장할 수 있음. char 타입 변수에 저장하려면 자동으로 문자로 매핑되어 출력되지만, int타입변수에 저장하면 유니코드 자체가 출력된다.
char var 1 = 'A';
int var 2 = 'A';
System.out.println(var1); //A를 출력
System.out.println(var2); //65를 출력
문자열 : 자바에서 큰 따옴표(")로 감싼 문자들
큰 따옴표(")로 감싼 문자 또는 여러 개의 문자들은 유니코드로 변환되지 않습니다.
작은 따옴표(')와 큰 따옴표(")는 컴파일러가 문자 리터럴과 문자열 리터럴을 구별하는 기호로 사용됨. 문자열을 변수에 저장하고 싶아면 String 타입을 사용해야한다.
String var 1 = "A";
String var 2 = "홍길동";
이스케이프 문자 : 문자열 내부의 역슬래시(\)
이스케이프 문자를 사용하면 문자열 내부에 특정 문자를 포함시킬 수 있다. (혼공자_자바 p.66)
자바는 실수 리터럴을 기본적으로 double 타입으로 해석하기 때문에 double 타입 변수에 저장해야 한다. 실수 리터럴을 float 타입으로 저장하고 싶다면 리터럴 뒤에 소문자f 또는 대문자F를 붙여서 컴파일러가 float타입임을 알 수 있도록 해야 한다.
float var 1 = 3.14; (오답)
float var 1 = 3.14F; (정답)
double var 2 = 3.14; (정답)
boolean 타입 변수는 주로 두가지 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는 데 사용함
자동타입변환 : 자동으로 타입변환이 일어나는 것 / 자동타입변환은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타이븡로 저장될 때 발생함.(혼공자_자바 p.72)
byte < short < int < long < float < double
실수 타입은 정수 타입보다 허용 범위가 더 크기 때문에 정수 타입이 실수 타입으로 저장될 경우에는 무조건 자동 타입 변환이 일어남.
char 타입의 경우 int 타입으로 자동 변환되면 유니코드 값이 int 타입에 저장됨.
char charValue = 'A';
int intValue = charValue; //65가 저장됨
System.out.println(intValue); //65를 출력
*char르 보다 허용범위가 작은 byte 타입은 char 타입으로 자동 타입 변환 될 수 없다. => char 타입 허용 범위는 음수르 포함하지 않는데, byte 타입은 음수를 포함하기 때문
강제타입변환 : 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것 / 강제 타입 변환은 캐스팅 연산자 괄호()를 사용하는데, 괄호 안에 들어가는 타입은 나누는 단위.
작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입 //(혼공자_자바 p.74)
int 타입은 char 타입보다 더 큰 허용 범위를 가지기 때문에 자동변환이 되지않는다. 하지만 (char) 캐스팅 연산자를 사용해서 char 타입으로 강제변환 할 수 있다. char 타입으로 변환하는 이유는 문자를 출력할 수 있기 때문이다.
int intValue = 65;
char charvalue = (char) intValue; //강제 타입 변환
System.out.println(intValue); //A가 출력됨
실수타입(float, double)은 정수타입(byte, short, int, long)으로자동변환할 때 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.
*정수 연산에서의 자동 타입 변환
int 타입보다 작은 byte, short 타입의 변수는 산술연산식에서 피연산자로 사용되면 int 타입으로 자동 타입 변환되어 연산을 수행한다.
*특별한 이유가 없는 경우 정수 연산에 사용되는 변수는 오른쪽 예시와 같이 int 타입으로 선언하는 것이 타입 변환을 줄여주는 방법.
byte x = 10;
byte y = 20;
byte result = x + y; (에러)
int result = x + y; (정답)
*int 타입보다 허용 범위가 더 큰 long 타입이 피연산자로 사용되면 다른 피연산자는 '무조건' long타입으로 변환하고 연산을 수행해야함. => 연산 결과를 long타입 변수에 저장해야함
실수 연산에서의 자동 타입 변환 : 정수연산과 마찬가지로 피연산자 중 하나가 double 타입이라면 다른 피연산자도 double 타입으로 자동 타입 변환되어 연산을 수행=>연산 결과는 double 타입이 된다.
만약 꼭 int 타입으로 변환해야 한다면 double 타입을 int 타입으로 강제 변환하고 덧셈 엿산을 수행하면 된다.
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue; //result에 15가 저장됨
*특정부분을 먼저 연산하고 싶을 경우
연산은 앞에서 부터 순차적으로 +연산을 수행한다. 그러나, 앞에서부터 순차적으로 +연산을 수행하지 않고 우선 연산하고 싶은 부분이 있다면 해당 부분을 괄호()로 감싸준다. 괄호()는 최우선으로 연산을 수행한다.
*문자열을 기본 타입으로 강제 타입 변환
String에서 int로 변환해보면,
String str = "10";
int value = Integer.parseInt(str);
-
String에서 double로 변환해보면,
String str = "12.345";
double value = Double.parseDouble(str);
-
String에서 boolean으로 변환해보면,
String str = "true";
boolean value = Boolean.parseBoolean(str);
문자열이 숫자가 아닌 알파벳이나 특수 문자, 한글 등을 포함하고 있을 경우 숫자 타입으로 변환을 시도하면 숫자 형식 예외(NumberFormatException)가 발생합니다.
String str = "1a";
int value = Integer.parseInt(str); //NumberFormatException발생
*반대로, 기본타입(byte, short, char, int, long, float, double, boolean)의 값을 문자열로 변경하는 경우, 간단히 String str = valueOf()메소드를 이용하면 된다.
String str = String.valueOf(기본타입값);
ex) String str = String.valueOf(3)을 실행하면 문자열 "3"을 얻을 수 있다.
System.out.println("출력내용"); //표준출력장치
System.in.read("입력내용"); //표준입력장치
*변수와 시스템 입출력 (혼공자_자바 p.90)
println(내용); : 괄호 안의 내용을 출력하고 해을 바꿔라
printf("형식문자열", 값1, 값2, ...); : 괄호 안의 첫 번째 문자열 형식대로 내용을 출력해라
*printf()메소드는 개발자가 원하는 형식화된 문자열을 출력
printf()의 괄호에는 출력 형식 문자열과 제공될 값을 쉼표로 나열한다.(혼공자_자바 p.90 표 참고)
*형식문자열에서 %와 conversation(변환문자)는 필수로 작성, 그 외의 항목은 모두 생략할 수 있다. %는 형식문자열의 시작, conversation에는 제공되는 값의 타입에 따라 d(정수), f(실수), s(문자열)을 입력한다.
형식문자열에 포함될 값이 2개 이상일 경우에는 값의 순번(argument_index$)을 알려주어야한다. ex) $1은 첫번째 값, $2는 두번째 값
flags는 빈자리를 채우는 방법(p.91 표 참고)
키코드를 읽기 위해서는 System.in의 read()를 이용한다.