Java 기초

Java 기초 (1. 메모리와 데이터 타입)

Kw_w 2024. 2. 27. 16:59

현재 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