현재 Java 공부 중 입니다...!
main() 메소드 → JRE에서 ClassLoader라는 모듈이 main함수를 찾습니다.
하나의 자바 애플리케이션은 반드시 하나의 main() 함수를 가지는 클래스가 존재해야 한다.
public static void main(String[] args) {
statements ...
}
자바 클래스 파일 (*.java)에 public class가 존재하면 소스 파일 이름은 반드시 해당 public class의 이름과 같아야 합니다
→ public class 는 자바 클래스 파이마다 단 한개만 가질 수 있다.
- 메모리
Method 영역, Stack영역, Heap영역
Method 영역 : 프로그램이 종료될 때 까지 메모리를 차지한다. (static 변수, static 함수)
→ 아래 코드에서 Method 영역에 포함 되는 것 (main 함수, twice 함수, s, Counter.get())
Stack 영역 : 블록이 닫히면, 자동으로 메모리를 반납, 지역변수가 저장, 함수를 사용할때만 메모리가 할당 되기에 동적메모리이다.
→ MemTest에 (a, b, counter, args)
Heap 영역 : GC가 자동으로 수거하는 영역
GC (Garbage Collector) : JVM에 포함된 자바만의 특징
→ Counter (state, count)
C언어에서는 Malloc으로 할당을하고, Free를 통해 메모리를 비워 줬지만, Java는 GC가 자동으로 메모리를 비워주기 때문에 따로 메모리 초기화를 할 필요가 없다.
public class MemTest {
static int s = 10;
public static void main(String[] args){
int a = 5;
int b = 10;
Counter counter = new Counter();
counter.get();
}
public static void twice(){
}
}
class Counter{
int state = 50;
int count = 20;
public int get(){
return state + count;
}
}
- 변수 : 변수는 데이터를 저장할 수 있는 메모리상의 공간을 의미 → 단 하나의 값만 저장할 수 있다.
변수명을 작성 시 -CamelCase를 사용
ex) studentName, yourName
변수는 선언을 했으면 반드시 초기화를 해야한다.
- Data Type : 해당 메모리가 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지 프로그래머가 명시적으로 알려주는 것
기본형 타입 (Primitive type)
실제 값을 저장하는 공간으로, stack 메모리에 저장
- 정수
public class IntegerTest {
public static void main(String[] args) {
//묵시적 형변환
byte by = 123;
System.out.println(by);
// 작은 사이즈에서 큰 사이즈로 갈 때는 묵시적 형변환이 이루어진다.
int iby = by;
System.out.println(iby);
// 명시적 형변환
// 큰 사이즈에서 작은 사이즈로 할 깨는 프로그래머가 형변환을 직접 해야한다.
by = (byte)iby;
System.out.println(by);
int i2 = 66666;
by = (byte)i2;
System.out.println(by);
short sby = 89;
i2 = sby;
sby = (short)i2;
// long 의 상수값을 넣을때는 L, l 을 뒤에 명기해야 한다.
long lby = 8899999999L;
lby = 45000L;
}
}
- 실수
정밀도를 요하는 숫자 혹은 기능에 사용 (ex. 기계, 의료장비등) 소수좀 자리까지 표현하는 수가 실수
→ 부동 소수점의 오류로 인해 잘 사용하지 않는다.
double과 float 차이
float는 4바이트(32bit)의 수까지 표현하고, double은 8바이트(64bit)까지 수를 표현한다.
double이 좀 더 큰 숫자까지 표현을 할 수 있다
public class FloatTest {
public static void main(String[] args) {
double d = 10.5;
float f = 10.5f;
double d_num = 28.45;
double d_num2 = 27.55;
double a = 1.0 / 3.0;
double b = 0.1 * 3;
double t_num = d_num - d_num2;
System.out.println(t_num);
System.out.println(a);
System.out.println(b);
BigDecimal bd = new BigDecimal("28.45");
BigDecimal bd1 = new BigDecimal("27.55");
System.out.println(bd.subtract(bd1));
int i = (int)3.14;
System.out.println(i);
}
}
- Char : 자바에서는 기본적으로 UNICODE를 채택 → 문자 캐릭터셋 : UTF-8
public class CharTest {
public static void main(String[] args) {
char ch1 = 'A';
System.out.println((char)(ch1+1));
System.out.println((int)ch1);
int ch2 = 68;
System.out.println((char)ch2);
char ch3 = '곱';
System.out.println((int)ch3);
System.out.println(Integer.toHexString((int)ch3));
char ch4 = '\\uacf1';
System.out.println(ch4);
// 자바에서 기본형 타입처럼 사용 할 수 있게 만들어 놓은 util class
String sStr = "안녕하세요";
System.out.println(sStr);
}
}
- String (=class)
java에서 String은 기본형이 아닌 참조형 타입 변수 Stack 영역이 아닌 Heap 영역에 저장
String 변수를 선언하는 방식은 2가지
- 리터럴 활용
- new 연산자 활용 (객체를 동적 메모리에 할당하는 행위)
public class StrTest {
public static void main(String[] args) {
// // 리터럴을 활용
// String a = "hello";
// System.out.println(a);
// System.out.println(a.hashCode());
//
// a = a + "world";
String a = "Hello";
String b = "Hello";
// 실제 저장된 메모리의 주소
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
// 객체 내부 상태에 기반해서 생성된주소
System.out.println(a.hashCode());
System.out.println(b.hashCode());
// new() 활용하기 -> heap 메모리에 저장이 됨
String str = new String("Hello");
String str2 = new String("Hello");
// python 과 달리 == 을 사용하면 not equal 이 나온다.- 메모리 주소가 다르기 때문에...
// 메모리 주소를 같다라고 조건을 걸면 같은 문자임에도 다르다고 결과가 출력
if (str.equals(str2)) {
System.out.println("equal");
} else {
System.out.println("not equal");
}
System.out.println(System.identityHashCode(str));
System.out.println(System.identityHashCode(str2));
// 객체 내부 상태에 기반해서 생성된 주소
System.out.println(str.hashCode());
System.out.println(str2.hashCode());
}
}
- boolean Type
true or false ( 파이썬에서는 True or False 이지만 자바는 소문자로 시작한다.)
boolean bFlag = true;
참조형 타입 (Reference type)
값이 저장되어 있는 곳에 주소값이 저장하는 공간으로 → Heap 메모리에 저장
→ 해당 타입은 GC가 청소하는 대상
- Type inference
Java 10버전부터 나왔으며, 지역변수 (= 함수 블럭내에서만) 사용가능 → var키워드 사용
public class TypeTest {
// 클래스 속성으로 사용될 수 없다.
// var kkk = 10;
public static void main(String[] args) {
// 지역변수 : 함수 블럭에서 선언된 함수
int i = 10;
var age = 10;
var dAge = 10.5;
var s = new String("kim");
// 한번 타입 추론이 된 변수를 다른 타입으로 재할당 할 수 없다
// age = "kim"
}
}
- 상수 (Constant)
변수의 반대개념 ↔ 상수
상수는 변하지 말아야 할 데이터를 저장하기 위한 수단
→ 초기화 이후 재할당이 불가능
final 이라는 키워드를 사용 사용 시 대문자와 ‘_’ 기호를 섞어서 사용
→ 스네이크 표기법(STREAM_TAG)
상수 사용이유
1. **프로그램이 실행 되면서 값이 변하면 안되는 경우** final int STUDENT_NUM = 10; 2. **코드의 가독성을 높이고 싶은 경우** * 비용을 계산한다고 가정 int cost = 100; final int STUDENT_NUM = 20; // totalCost = 100 * 10; totalCost = cost * STUDENT_NUM; 3. **코드 유지보수를 쉽게 하고자 할 때** D.java 파일에서 아래와 같이 선언 ****public static final int STUDENT_NUM = 12; 예를 들어 A.java, B.java에서 학생 수를 가지고 계산하는 비지니스 로직이 있다고 가정 예를 들자면 A, B 클래스에서는 D.STUDENT_NUM * 100
→ final 을 개발자가 사용했다는 것은 절대 변하면 안 된다는 것을 강조하고 있다.
'Java 기초' 카테고리의 다른 글
Java 기초 (4. Overload vs Override) (2) | 2024.03.12 |
---|---|
Java 기초 (연습하기-1) (0) | 2024.03.12 |
Java 기초 (3. Switch문, While문) (0) | 2024.02.29 |
Java 기초 (2. 형변환과 연산자, 조건문) (2) | 2024.02.28 |
Java 개론 (0) | 2024.02.26 |