컴파일
1.
Hello.java를 컴파일해본다.
a.
자바 컴파일러 javac.exe를 사용해서
b.
소스파일 Hello.java로부터
c.
클래스파일 Hello.classs를 생성한다.
Hello.java를 컴파일한 결과가 Hello.class인 것
즉, Hello.java를 컴퓨터가 이해할 수 있는 언어로 컴파일해준 것이다.
컴파일의 이해
2.
Hello.class를 실행해본다.
a.
자바 인터프리터 java.exe로 실행
1. 코딩(프로그램 작성)
2. 저장
3. 컴파일
4. 실행
JDK의 bin디렉토리에 있는 주요 실행 파일들을 다시 살펴보면,
•
javac.exe → 자바 컴파일러. 자바소스코드를 바이트코드로 컴파일한다.
c:\jdk1.8\work>javac Hello.java
•
java.exe → 자바 인터프리터. 컴파일러가 생성한 바이트코드를 해석하고 실행한다.
c:\jdk1.8\work>java Hello
•
javap.exe→ 역어셈블러. 컴파일된 클래스파일을 원래의 소스로 변환한다.
c:\jdk1.8\work>javap Hello>Hello.java
바이트코드 - JVM이 이해할 수 있는 기계어. JVM은 바이트코드를 해당 OS의 기계어로 변환하여 OS로 전달함
•
jar.exe → 압축프로그램. 클래스파일과 프로그램의 실행에 관련된 파일을 하나의 jar파일로 압축하거나 압축해제한다.
JDK와 JRE
1.
JDK
•
자바 개발 도구 (Java Development Kit)
•
JRE+개발에 필요한 실행파일(javac.exe 등)
2.
JRE
•
자바 실행 환경(Java Runtime Environment).
•
자바로 작성된 응용프로그램이 실행되기 위한 최소환경.
•
JVM+클래스라이브러리(Java API)
Java의 구성
•
컴파일하면 .java 파일이 .class 파일이 됨.
•
자바는 class 단위로 구성된다. (자바의 기본 단위) = 자바는 클래스 파일들 간의 결합이다.
•
클래스 파일이 모여서 하나의 프로젝트가 된
Java의 명명 규칙
개발자가 클래스명, 변수명, 메서드명 작명해야함.
1.
이름만 보고도 어떤 역할인지 추측할 수 있어야 함
2.
클래스명의 첫 글자는 대문자로 시작한다.
3.
변수명의 첫 글자는 소문자로 시작하며 명사형일 것
4.
메서드명의 첫 글자는 소문자로 시작하며 동사형일 것
•
끝에 ()가 있으면 메서드, 없으면 변수
ex) main(), println(), getLogin(), setAdd()..
5.
두 단어 이상 합성하여 이름을 만들 경우
a.
Camel 표기법
•
두 번째 단어의 첫 글자를 대문자로 표기
ex) maxValueAge
b.
Snake 표기법
•
단어와 단어를 _ 언더바로 연결
ex) max_value
6.
모든 이름은 숫자로 시작할 수 없다.
7.
특수 문자는 _와 $만 가능하다
8.
띄어쓰기 불가
9.
한글 쓸 수 있지만 쓰지말자
변수(variable)
•
변하는 값
•
하나의 값을 저장하는 메모리(Ram)상의 공간
즉, 변수 이름 = 메모리 공간에 이름 붙여주는 것임. 이 이름을 이용해 저장공간(변수)에 값을 저장하고, 저장된 값을 읽어올 수도 있다. 이 공간에 저장된 값은 변경될 수 있기 때문에 ‘변수’라는 이름을 갖게 되었다.
•
따라서 변수 이름은 중복될 수 없음.
•
변수는 소문자로 시작한다.
•
println으로 변수 출력할 때는 쌍따옴표 안 써도 됨. → system.out.println(name);
ex) String name = “홍길동” → name이라는 변수에 ‘홍길동’이라는 값을 담아주세요
•
하나의 변수에는 단 하나의 값만 저장할 수 있으므로, 새로운 값을 저장하면 기존의 값은 사라진다.
변수의 선언
int age; //age라는 이름의 변수를 선언
변수타입 변수명
JavaScript
복사
•
변수 타입: 변수에 저장될 값이 어떤 타입(type)인지 지정하는 것
•
변수명: 변수가 ‘값을 저장할 수 있는 메모리 공간’이라면, 변수명은 그 메모리 공간에 이름을 붙여주는 것임. 이 이름을 통해 저장공간(변수)에 값을 저장하고, 저장된 값을 읽어올 수도 있다.
변수를 선언하면, 메모리의 빈 공간에 ‘변수타입’에 알맞은 크기의 저장공간이 확보되고, 이 저장공간을 ‘변수명’을 통해 사용할 수 있게 된다.
int num = 10;
광할한 메모리에 4byte(Int) 공간을 마련하고 거기를 num이라고 명명함.
그리고 거기에 10을 저장해. 근데 2진수로 바꿔서!! 00001010
내가 num 호출하면 다시 10진수로 바꿔서 출력해줘
Java
복사
int num;
num = 10;
long num;
num = 10;
-> 이렇게 똑같은 변수명으로 중복 선언하면 안된다.
데이터 타입이 달라도 변수명이 같으면 오류남. 겹치지 않게 다른 이름으로 바꿔야 함.
JavaScript
복사
변수의 초기화
변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것을 뜻한다. 선언된 변수에 최초로 값을 대입하는 것.
변수를 선언하면 그 변수를 사용할 수 있게 되는데, 그 전에 반드시 변수를 ‘초기화(initialization)’해야 한다. 메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 ‘알 수없는 값(쓰레기값, garbage value)’이 남아있을 수 있기 때문이다.
변수에 값을 저장할 때는 =를 이용한다. 오른쪽의 값을 왼쪽(변수)에 저장하라는 의미이다. 그래서 대입연산자의 왼쪽에는 반드시 변수가 와야 한다.
int age = 27; //변수 age를 선언하고 27로 초기화한다. 선언과 동시에 초기화한 것.
Java
복사
int num; //선언만 한 상태. 이 상태에서 num 사용하면 (호출하면) 에러남. 값이 없는데 뭘 불러와
Java
복사
int num;
num = 10;
num = 20; //이건 초기화 아님.
-> 하나의 값만 저장할 수 있기 때문에, 10은 사라지고 20이 다시 대입된다.
(덮어씌움) 최종적으로 20이 저장된다.
JavaScript
복사
변수의 데이터 타입
data(값)의 type(종류)에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이 자료형(data type)이다. 자료형에는 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 등이 있으며, 변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택하면 된다.
기본형과 참조형
•
기본형 변수 → 실제 값을 저장
•
참조형 변수 → 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다.
자바는 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
bloolean은 ture, false 두 가지만 값만 표현 → 가장 작은 크기인 1byte
char는 자바에서 유니코드(2byte 문자체계) 사용 → 2byte
byte는 크기가 1byte라서 byte
int(4 byte)를 기준으로 짧은 short → 2byte / 긴 long → 8byte
float는 실수값을 부동소수점 방식으로 지정하기 때문에 4byte
double은 float의 두배여서 8byte
1.
Primitive Type(원시 타입, 기본 타입, 기본형)
•
더 이상 분리할 수 없는 데이터를 말함
•
실제 값(data)을 저장
•
계산을 위한 실제 값 저장
a.
숫자
i.
정수형: 소수점이 없는 숫자
byte | 1byte | 8bit | -128 ~ +127 | bit 다룰 때 주로 사용한다. |
short | 2byte | 16bit | -32768 ~ +32767 | C언어와 호환 |
int | 4byte | 32bit | -20억 ~ +20억 | |
long | 8byte | 64bit | -2^63 ~ +2^63-1 |
1 TB | = | 1024 GB |
1 GB | = | 1024 MB |
1 MB | = | 1024 KB |
1 KB | = | 1024 Byte |
1 Byte | = | 8 Bit |
부호 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0은+
1은- |
다 같은 정수형인데 4가지나 있는 이유? 각 타입마다 저장할 수 있는 값의 범위가 다르므로 저장할 값의 범위에 맞는 타입을 선택하면 된다.
자바에서는 int를 많이 사용한다. int는 CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문이다.
4개의 정수형 중, Int형이 기본 자료형(default data type)
int num;
num = 10;
long num2;
num2 = 10L;
long num3;
num3 = 351234324123412L;
long 쓰려면 숫자 뒤에 L 적어야 컴이 long으로 인식할 수 있다.
L 안 적고 351234324123412 적으면 int로 인식해서 오류난다.
(int는 저렇게 큰 숫자를 담을 수 없음)
Java
복사
ii.
실수형: 소수점이 있는 숫자
실수형 (double, float)중, double이 기본 자료형(default data type)
float | 4byte | 소수점 7자리까지 표현 가능 |
double | 8byte | 소수점 15~16자리까지 표현 가능 |
float f = 3.25; -> 오류남
float f = 3.25F; -> 이렇게 써줘야 float으로 인식함.
JavaScript
복사
float과 double을 구별하기 위해 리터럴 뒤에 대소문자 f를 작성한다.
F를 적지 않으면, double을 float으로 변환할 수 없다는 오류 메세지가 뜬다. 즉, F를 입력하지 않으면 double로 인식됨을 알 수 있다.
double이 더 많은 수를 표현할 수 있어서 정밀도도 높음. double을 쓰는게 맘 편함.
(그런데 은행권 같은 곳에서는 이자율 등 소수점 계산이 중요하다 보니 더 정확한 계산이 필요함. 그래서 자바에서는 BigDecimal 클래스를 활용한다네) 참조
리터럴에 소수점이나 10의 제곱을 나타내는 기호 E 또는 e, 그리고 접미사 f, F, d, D를 포함하고 있으면 실수형 리터럴로 간주된다.
자료형 | 실수형 리터럴 | 다른 형태의 동등한 표현 |
double | 10. | 10.0 |
double | .10 | 0.10 |
Float | 10f | 10.0f |
float | 3.14e3f | 3140.0f |
double | 1e1 | 10.0 |
double | 1e-3 | 0.001 |
b.
문자형
char(자료형) | 2byte | 문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다. |
리터럴 앞 뒤를 홑따옴표 ‘ 로 감싸야 한다.
char ch = 'A';
char ch = '3'; <- 문자일까 숫자일까? 문자임
JavaScript
복사
더 정확히 말하면 ‘문자’가 저장되는 게 아니라 ‘문자의 유니코드(정수)’가 저장된다. 컴퓨터는 숫자만 아는 바보..
문자’A’의 유니코드는 65이므로 변수 ch에는 65가 저장된다.
그래서 문자 리터럴 대신 문자의 유니코드를 집어 넣을 수도 있음. ch에 65를 직접 저장할 수 있는 것임.
char ch = 65;
System.out.println(ch);
-----------------------
console
A
Java
복사
이처럼 문자형인 char는 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 별반 다르지 않으며, 정수형 또는 실수형과 연산도 가능하다.
c.
논리형: 참거짓
boolean | 1byte | true, false 중 한 가지의 값만 담을 수 있다. 조건식과 논리적 계산에 사용된다. |
•
기본값은 false이다.
•
소문자로만 작성해야함
2.
Reference Type(참조 타입, 참조형)
•
primitive type을 제외한 나머지 모두 참조 타입이다.
•
참조변수 = 사용자 정의 데이터타입
java가 정의하지 않은 데이터타입을 사용자가 만들어서 쓰겠단 말
•
참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다.
•
참조변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스가 참조변수의 타입이 된다. 따라서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.
•
참조변수는 null 또는 객체의 주소를 값으로 갖는다.
Scanner sc = new Scanner(System.in);
여기서 Scanner가 클래스명, sc가 변수명, Scanner()가 메서드
여기서 잠깐! 변수 선언 방법이 머라고? 데이터타입 변수명;
그럼 Scanner sc; 에서 sc가 변수명이니까 Scanner는 데이터 타입이겠네
이렇듯 클래스=데이터타입이라는 이야기..
Java
복사
실제로 JRE System Library > java.base > java.util 들어가보면 Scanner.class가 있음
JRE System Library > java.base > java.lang 에 들어가보면 String.class가 있음
a.
String
•
문자열(문자 배열, 문자 여러 개를 합친 것)
•
앞뒤를 “ “로 감싸야 한다.
String name = "kjh";
JavaScript
복사