TPC
메모리에서 어떻게 동작이 되는지 이해하는 단계.(문법, 용어, 기술)
따라하기-스스로 하기-응용하기 단계로 학습예정.
jvm: 자바가상머신. 자바 프로그램을 실행해주는 프로세서(엔진).
jre: 자바실행환경.
jdk: 자바개발환경. 설치 시 jvm, api, tool이 pc에 설치된다.
java언어는 객체지향언어이므로 객체(Object)단위로 프로그래밍해야함.
java에서의 객체는 곧 클래스 단위이므로 실제로는 클래스(Class)단위로 프로그래밍하게 됨.
클래스 내에 기능(method)이 포함되는 형태.
메인클래스: main메서드를 가지고 있는 클래스. 메인 클래스로부터 프로그램이 시작된다.
즉, 메인 클래스는 클래스(.class
) 당 하나만 존재함.
method: 동작을 처리하는 함수(Function). 자바에서의 메서드와 함수는 같다고 보면 된다. 동작의 이름(매개변수){ 처리 }
참고_intelliJ에서
System.out.println()
의 단축명령어는sout
실행단축키는shift
+f10
src 프로젝트: java 소스코드(파일)가 저장되는 폴더. 소스파일은 이름.java
로 저장한다.
컴파일: 개발자가 입력한 소스코드(고급언어)인 .java
파일을 실행가능한 .class
파일(저급언어)로 변환시키는 과정.
java에서 실행가능한 코드 .class를 byte code
라고 한다.
참고_intelliJ로 파일을 실행시키면 생기는
out
폴더는 실행파일인.class
파일이 저장되는 폴더임.
터미널에서 컴파일하기
프로젝트명\src>javac.exe -d ..\out\production\FestCampus HelloWorld.java
한글이 포함되어있는 경우 -encoding UTF-8
을 마지막에 이어붙여 실행한다.
이때 컴파일에 시간이 걸리므로 주의.
터미널에서 실행하기
프로젝트명\src>java.exe -classpath ..\out\production\FestCampus HelloWorld
상단의 실습에서 java.exe는 jvm을 호출하는 명령어이다.
jdk를 설치하면 jre가 내포되어 있다.
jre에 jvm도 포함되어 있음.
jre는 자바의 실행환경이며 jvm은 자바의 실행머신이기 때문.
OS에 독립적인 개발이 가능하다.(확장성이 좋음.)
1차 컴파일 된 bytecode(.class, 중간어 코드라고도 함)를 자신의 os에 맞게 2차 컴파일하여 (.exe) 메모리에 로딩하여 실행하는 구조.
즉, 윈도우에서 만든 프로그램을 다른 os에서도 실행이 가능하다.
실행 전 무조건 컴파일이 필요하므로 실행속도는 즉각실행하는 다른 언어에 비해서 느리다.
자동으로 메모리를 관리한다.
Thread 내의 Method Area
Heap Area
Stack Area
Runtime Constant Pool
메모리 영역 중 적합한 메모리를 골라 jvm이 알아서 관리 및 배분한다.
변수: 데이터를 저장하는 메모리 공간의 이름
자료형: 변수의 크기와 어떤종류의 데이터를 저장할지를 결정하는 것
할당: 변수에 데이터를 저장하는 것
자료형을 보면 변수의 크기(예-int의 경우 4byte)와 종류를 알 수 있다.
변수명 짓는 규칙
$
, _
이외의 특수문자 사용이 불가하다.변수를 만드려면(메모리에 기억공간을 만드려면) 선언이 필요하다.
기본 자료형(int, float, char 등)과 사용자정의 자료형(Movie, Book, Member 등)이 존재.
DataType | 크기 | 데이터(종류) | Default Value |
---|---|---|---|
byte | 1byte | 정수 | 0 |
short | 2byte | 정수 | 0 |
int | 4byte | 정수 | 0 |
long | 8byte | 정수 | 0L |
float | 4byte | 실수 | 0.0f |
double | 8byte | 실수 | 0.0d |
char | 8byte | 문자 | \u0000, null |
boolean | 1byte | 참, 거짓 | fasle |
int
, 실수는 double
, 문자는 char
, 참거짓 boolaen
의 4가지가 기본형이다.문자열형인 string
은 java에서 제공하는 자료형(api)을 사용하면 된다.
참고로 java의 경우
char
형이 2byte이므로 비영여권 언어를 표현할 수 있다.
c언어는char
형이 1byte이므로 비영어권 언어를 표현하려면 배열 등의 다른방법이 필요함.
`public class CarTest {
public static void main(String[] args) {
// 자동차의 정보를 저장하기 위한 변수를 만드시오.
String model = "BMW538i";
System.out.println("model = " + model);
long distance=1000000;
System.out.println("distance = " + distance + "Km");
int price=90000000;
System.out.println("price = " + price);
String company ="BMW";
System.out.println("companys = " + company);
char type = 'A';
System.out.println("type = " + type + "Type");
boolean auto= true;
System.out.println("auto = "+ auto);
int year = 2010;
System.out.println("year = " + year);
float gasmi = 12.5f;
System.out.println("gasmi = " + gasmi);
}
}
변수를 선언하면 변수가 메모리에 만들어진다.
int a;
변수에 저장된 데이터타입에 맞게 데이터를 저장(대입)하는 행위.
L-Value = R-Value;
변수를 만든 후 연산을 하기 전에 값을 저장하는 행위.
초기화를 하지 않으면 찌꺼기값이 들어가게 되며, 연산이 불가능하다.
아래 예시처럼 변수선언과 초기화를 동시에 할 수 있다.
int a = 10;
public class VDATest {
public static void main(String[] args) {
// 문제2. 변수a에 10을 저장하고 a에 저장된 값을 변수 b에 10을 곱하여 변수 c에 저장하시오.
int a = 10; // 변수 초기화
System.out.println("a = " + a);
int b = a;
System.out.println("b = " + b);
int c= b*10;
System.out.println("c = " + c);
// 문제3. sum이라는 변수에 1부터 5까지의 수를 누적하여 출력하시오.
int sum = 0;
for(int i = 1; i<6; i++){
sum+=i;
}
System.out.println("sum = "+sum);
// 문제4. x에 10을, y에 20을 저장하고 변수의 값을 서로 교환(swap)하여 출력하시오.
int x = 10;
int y = 20;
int temp;
temp = x;
x = y;
y = temp;
System.out.println("x = " + x+", y = " + y);
}
}
변수를 관리하는 테이블. (변수의 이름과 저장된 번지를 테이블형태로 저장하여 관리)
변수가 만들어지려면 변수를 관리하는 테이블에서 변수 정보가 저장된다.
key | value(주소값) |
---|---|
a | 100 |
b | 200 |
c | 400 |
key는 변수의 이름, value는 변수가 저장된 번지수를 저장한다.(Symbol table에 값을 바로 저장하는 것이 아님)
예를 들어 선언하지 않은 변수를 이용해 연산 등의 작업을 할 경우 발생하는 에러가 cannot find symbol...
이다.
symbol을 찾지 못했다는 의미.
-학습정리 & quiz-
Q1. 변수, 자료형, 할당
Q2. 선언
Q3. float f;
Q4. 1.boolean 6.char 9.short 11.int 12.long 15.float 16.double
Q5. 4byte 정수형
Q6. symbol table
class로 새로운 자료형을 만들어서 사용할 수 있다.
기본자료형이 아닌 string은 java에서 미리 만들어 제공하는 자료형(api)으로, toUpperCase()
, toLowerCase()
, Trim()
등의 메서드를 사용할 수 있다.
string역시 사용자정의 자료형처럼 class의 형태로 만들어져있으나 java가 미리 만들어 제공한다고 생각하면 된다.
기본자료형은 기본적으로 가지고있는 자료형이므로 컴파일러가 바로 찾을 수 있다.
string같은 경우 기본자료형이 아니므로 해당 자료형을 만들어 둔 주소를 가르쳐주어야 한다.
→ 패키지를 import
하여 위치를 불러오도록 함.
원래라면 java.lang.String = "a";
로 선언해야 하지만 앞의 java.lang
은 생략된 것.
public class FindAPI {
public static void main(String[] args) {
String str = "apple";
System.out.println("str.length() = " + str.length());
}
}
2진수는 앞에 0b
를, 8진수는 0
을, 16진수는 0x
를 앞에 붙여주면 해당하는 진법의 숫자형으로 인식한다.
public class BinaryExam {
public static void main(String[] args) {
// Q.123을 10진수, 2진수, 8진수, 16진수로 출력하라.
int decimal = 123;
System.out.println("decimal = " + decimal);
String binary = Integer.toBinaryString(decimal);
System.out.println("binary = " + binary); // 0b1111011
String octal = Integer.toOctalString(decimal);
System.out.println("octal = " + octal); // 0173
String hexa = Integer.toHexString(decimal);
System.out.println("hexa = " + hexa); // 0x7B
int a = 0b1111011;
System.out.println("binary = " + a);
int b = 0173 ;
System.out.println("octa = " + b);
int c = 0x7B;
System.out.println("hexa = " + c);
}
}
컴퓨터는 문자도 숫자로 처리한다.
아스키코드를 사용할 경우 A
는 65, 문자 0
의 코드값은 48에 해당한다. (이 두 가지는 알아두자)
비영어권의 문자를 표기하기 위해 아스키코드(ASCII)보다 확장된 유니코드(Unicode, UTF-8)를 사용한다.
문자형인 char
는 Unicode
를 사용.
문자열 저장 시 앞에 \u
를 붙이면 유니코드 문자로 인식한다. (2진수, 8진수, 16진수를 입력할때 각각 다른 문자를 앞에 붙여주어 알리는 것과 동일하다.)
자바는 문자 하나에 2byte의 공간을 할당하기 때문에 c언어처럼 배열 등의 방법을 사용하지 않아도 바로 한글을 표현할 수 있다.
유니코드에서 대소문자간의 코드값 차이는 32이다.
문자 A
는 65, a
는 97의 코드값을 가지며, 프로그램에서 대소문자를 바꿀 경우 대→소문자면 코드값에 +32를, 소→대문자이면 -32를 하는 식으로 대응한다고 생각하면 된다.
예제 1
int a = 'A';
System.out.println("a = " + a);
int b = 'B'+1;
System.out.println("b = " + b);
System.out.println("b = " + (char)b);
→ int자료형에 문자 A
를 저장했지만 컴퓨터 내부적으로는 문자도 숫자로 처리하기 때문에 에러가 발생하지 않는다.
마찬가지로 연산도 가능.
int b = 'B'+1;
에서 변수b
를 출력하면 B
의 다음 문자인 C
가 출력된다.
예제 2
// Q. '가'라는 한글 한 문자를 변수에 저장하고 출력하시오.
char han = '가';
System.out.println("han = " + han);
System.out.println("int_han = " + (int)han);
int hanU = '\uAC00';
System.out.println("hanU = " + hanU);
System.out.println("hanU = " + (char)hanU);
int hanU = '\uAC00';
에서 \u
는 해당 문자(여기서는 AC00
)가 유니코드 포맷임을 알려주는 문자이다.
예제 3
// Q. '1' + '2' = 3을 구현하시오.
int one = '1';
int two = '2';
int answer = (one-48) + (two-48);
int answer1 = (one-'0') + (two-'0');
System.out.println("answer = " + answer); // answer = 3
System.out.println("answer1 = " + answer1); // answer1 = 3
int로 저장한 '1'과 '2'를 단순히 +해서 출력하면 99가 나오게 된다.
그러므로 '1'에서 '0'의 코드값인 48을 빼주거나, 혹은 문자 '0'을 -연산한 결과끼리 더하면 답으로 숫자 3이 나오게 된다.
작은 타입을 큰 타입에 넣는 것은 문제가 없음. (이때는 자동 형변환이 된다. -예제1 참고)
반대로 큰 타입을 작은 타입에 넣으면 에러가 발생하므로 이때 강제 형변환(Casting)이 필요하다.
형 변환(Casting) 이란?
값의 타입(DataType)을 다른 타입으로 변경하는 것.
(DataType)변수;
의 형태로 사용.
boolean
타입은 형변환이 불가.
강제 형변환 시 주의점
변경전후의 자료형끼리의 자료의 크기(byte)가 같더라도 표현할 수 있는 값의 범위가 다를 경우 형 변환 시 표현하지 못하는 범위의 데이터에 대한 손실이 발생할 수 있으니 유의.
예제 1
float x = 15.6f;
int y = (int)x; // 강제 형변환 (데이터 손실)
System.out.println("y = " + y); // y = 15
char c = 'A';
int cc = c; // 자동 형변환
System.out.println("cc = " + cc); // cc = 65
-학습정리 & quiz-
1. 기본 자료형, 사용자정의 자료형
2. String
3. 179, 0263, 0xB3
4. int, double
5. ASCII
6. Unicode
7. 32
8. casting (형 변환)
9. float f1 = 56.7f; int f2 = (int)f1;
기초라고 가볍게 넘겼던 부분을 이론위주로 깊게 다뤄주어서 복습하기에 좋은 강의라고 생각한다.
앞으로 나올 개념에 대해 단편적인 지식이라도 있으면 훨씬 이해하기에 도움이 되는 내용이 아닌가 싶다.
특히 형변환과 자료형에 대해서 책보다 깊이 다루어 앞으로 나올 클래스를 사용하는 이유를 확실하게 짚어주어 많은 도움이 되었다.