# 4. Java 4일차(230818) [국비교육]

brand_mins·2023년 8월 18일

Java

목록 보기
4/47

1. 자료형 정리

(1) 자료형 정리

1) Boolean

  • 참, 거짓 값을 저장할때 boolean형
  • 자바 프로그래밍 언어에서 논리형을 프로그램에서 표현하고자 할때 반드시 true, false 출력

2) 문자형 char

  • 문자를 컴퓨터에 저장할 때 사용하는 자료형.
  • 유니코드를 사용. 문자 1개를 의미함.

3) 정수형 byte

  • 메모리에 저장할 때 1byte 크기로 저장할 수 있는 범위가 -127~128이다.

4) 정수형 int

  • 메모리에 저장할때 4byte 크기로 저장할 수 있는 범위가 -32768 ~32767.

5) 정수형 long

  • 메모리에 저장할때 8byte 크기로 저장할 수 있는 범위가 -2147483648 ~ 2147483647.

6) 실수형 float

  • 메모리에 저장할 수 있는 4byte 크기.

7) 실수형 Double

  • 메모리에 저장될 때 8byte 크기이고 저장할 수 있는 실수 범위는 -1.7E308 ~ 1.7E038

(2) 기본 자료형과 참조 자료형

1) 기본 자료형

  • 크기가 정해져 있는 자료형
  • 기본 자료형 변수가 가리키는 주소의 메모리 위치에 데이터가 존재.
  • 저장공간에서 상자안에 데이터가 있다면 기본 자료형.

2) 참조 자료형

  • 크기가 정해져 있지 않는 자료형
  • 참조 자료형 변수에는 주소의 메모리 주소데이터 존재.

(3) 힙과 스택

  • 기본 자료형과 참조 자료형을 분리하는 이유는 속도 향상.
  • 즉, 크기가 일정한 기본자료형과 참조자료형의 주소는 접근성이 용이한 스택이라는 메모리에 저장.
  • 일정하지 않은 참조형 자료형의 실제 데이터는 힙에 저장.

힙과 스택 보충설명

(1) 스택

  • 힙 영역에 생성된 object 타입의 데이터들에 대한 참조값.
  • 원시 타입(byte, short, int, long, double, float, boolean, char)인 경우 실제 데이터 값이 할당.
  • 프로그램이 동작하면서 발생하는 지역변수 데이터를 순서대로 저장하는 메모리
public class Main {
	public static void main(String[] args) {
    	int a;
        m1();
     }
     public static void m1() {
     	int b;
        double q;
        m2();
     }
     public static void m2() {
     	int c;
        boolean z;
     }
 }

<자세한 설명>
1. main 메소드 호출되면 아래와 같이 스택에 쌓인다.

2. main 메소드 호출이 끝나고 스택은 후입선출 구조. 스택의 할당된 값들이 종료.

  • 후입선출: 끝에서부터 출력.

(2) 힙

  • 힙 영역에는 생명주기가 긴 데이터가 저장.
  • 모든 object type(String, ArrayList, HashMap, Inteter...)
public class Main{
    public static void main(String[] args) {
        int a;
        m1();
    }
    public static void m1() {
        int b;
        doublc q;
        m2();
    }
    public static void m2() {
        int c;
        boolean z;
        m3();
    }
    public static void m3() {
        String str = "휴먼입니다.";
        str += "반가워요";
    }
}

<자세한 설명>
1. m3 메소드가 호출된다.

2.m3의 str은 초기화를 2번하는 구조이다. 마지막으로 선언된 str을 reference

3. 스택에 str라는 이름으로 생성된 변수는 할당된 값을 가지고 있는 것이 아닌 힙의 선언된 String을 reference.

4. 힙에서 String:"휴먼입니다"는 unreachable object(어떤 변수도 참조하지 않는 객체)
5. 참조되지 않는 데이터가 힙에 존재하기 때문에 메모리 누수 발생. JVM에서 GC(Garbage Collection)가 동작하여 참조하지 않는 객체 제거.

(4) 전역변수와 지역변수

1) 전역변수

  • 프로그램 모든 곳에서 사용 가능한 변수.
  • 클래스 안에 static을 붙여서 변수 선언
  • 전역변수를 저장하는 공간은 메소드영역

2) 지역변수

  • 프로그램 특정 블록에서만 사용할 수 있다.
  • 메소드나 if, for 등의 {괄호 안 변수}를 기술하면 지역변수.
  • 지역변수를 저장하는 공간은 스택영역

package com.human.ex;
public class JavaStart00 {
	static int a=22; // 전역변수는 모든 지역에서 사용 가능.
	public static void main(String[] args) {
    	System.out.println(JavaStart00.a);
        System.out.println(a);
       	// main메소드 안에서만 사용할 수 있는 지역변수.
        // if,for문 등 자바문법을 사용하다 보면 중괄호 생김.
        // 해당 중괄호 안에 선언하는 변수는 지역변수.
        int a=10; 
        // 이름이 같으면 지역변수가 우선순위를 가짐.
        // 애매함을 없애기 위해서 전역변수는 클래스 이름.변수명으로 기술.
        System.out.println(a);
        {
        	int b=20;
            System.out.println(a);
            System.out.println(b);
            System.out.println(JavaStart00.a);
        }
        {
        	int b=30;
            System.out.println(a);
            System.out.println(b);
        	System.out.println(JavaStart00.a);
        }
        System.out.println(a); // 10
        System.out.println(JavaStart00.a);
        }
   }
  • 전역변수 이름에 클래스 생략.
public class Example {
	// 전역 변수
    static int globalVar = 10;
    public static void main(String[] args) {
    	// 지역 변수
        int localVar = 5;
        System.out.println("globalVar: " + globalVar);
        System.out.println("localVar: " + localVar);
		// 지역 변수 우선 사용
        int globalVar = 20;
        System.out.println("globalVar: " + globalVar); // 20 출력
        System.out.println("globalVar: " + Example.globalVar); // 전역변수출력 10
        }
   }
  • 메모리 영역은 메소드, 스택, 힙으로 구분.
    • 구분이유: 속력때문.
      • 메소드영역: 실행 코드들과 전역 변수가 올라감
      • 스택: 지역변수가 올라감
      • 힙: new 연산자로 생성한 데이터가 메모리에 올라감.
public class JavaMemory {
	static int a = 10;
    static String b = new String("hello");
    public static void main(String[] args) {
    	double c = 13.4;
        String d = new String("World");
        // 문자열은 수정이 안되고 새로 생성돼서 메모힙에 생성.
        String e = JavaMemory.b+d;
        String f = e + "1";
        }
    }

2. 사용자 정의 자료형 클래스

  • 고양이와 강아지의 클래스를 생성하고 각 데이터를 입력받아 출력하는 프로그램 만들기
    • 바이트코드 파일 내 클래스2개를 생성하려면 public을 제거하면 된다.
    • String.format 메소드로 활용해도 되고 인스턴스를 활용할 수 있다.
    • 데이터를 변경하고 싶다면 출력 메소드 아래에 변경한다.
package com.human.ex;
class Cat {
	String catColor = "흰색";
    String catOwnerName = "홍길영";
	String catName = "고양이";
	int catAge = 4;
}
class Dog {
	String dogColor = "갈색";
	String dogOwnerName = "홍길순";
	String dogName = "강아지";
	int dogAge = 2;
}
public class MyClass3 {
	public static void main(String[] args) {
		Cat c = new Cat();
		System.out.println(c);
		System.out.println(c.catColor);
		System.out.println(c.catOwnerName);
		System.out.println(c.catName);
		System.out.println(c.catAge);
		System.out.println();
        Dog d = new Dog();
		System.out.println(d);
		System.out.println(d.dogColor);
		System.out.println(d.dogOwnerName);
		System.out.println(d.dogName);
		System.out.println(d.dogAge);
	}
  }

(1) 기본 자료형을 사용해서 클래스 선언하는 법

  • int a =10이라고 선언한 것처럼 Human h = new Human();로 선언할 수 있다.
  • 값을 변경할때 인스턴스를 활용하여 사용한다.
    즉, a=20, h.age=30
package com.human.ex;
class Human {
// int,double 같은 내가 만든 새로운 자료형 사용자 정의
public String name="홍길동";
public int age = 10;
public double height = 169.3;
}
public class MyClass2 {
	public static void main(String[] args) {
    	// class를 자료형으로 시작하려면 new 연산자 생성
        Human h = new Human();
        // 클래스에 데이터가 할당된 변수를 인스턴스
        System.out.println(h);
		System.out.println(h.name);
		System.out.println(h.age);
		System.out.println(h.height);
        System.out.println();
        // a=10; a를 변경하고 싶으면 변경하면 된다. 
        // h.age의 10을 변경하고싶다면 h.age를 변경하면 된다.
        h.name = "홍길남";
        h.age = 20;
        h.height = 150;
        System.out.println("변경후");
		System.out.println(h.name);
		System.out.println(h.age);
		System.out.println(h.height);
        System.out.println();
        // 홍길동 객체를 추가해서 홍길동과 홍길남의 나이를 더한 합을 출력
        Human h2 = new Human();
        System.out.println("두 사람 나이 합산: " + (h.age+h2.age));
        }
   }

package com.human.ex;
//com.human.dto 밑에 있는 Human클래스 등록
import com.human.dto.Human; 
//com.human.dto 밑에 있는 모든 클래스 등록
import com.human.dto.*;
public class MyClass4 {
	public static void main(String[] args) {
		// 저장 공간을 new로 힙에 생성하면서 변수생성
		Human h1 = new Human();
		Human h2 = new Human();
		Human h3 = new Human();
		// 저장 공간 생성 없이 주소만 변수에 생성
		Human hu1 = new Human();
		Human hu2 = hu1;
		Human hu3 = hu2;		
        System.out.println(h1.name+":"+h2.name+":"+h3.name);	
        System.out.println(hu1.name+":"+hu2.name+":"+hu3.name);
		System.out.println();
		// hu1,2,3은 같은 주소이므로 같은 곳의 데이터가 변경된다.
		h1.name="홍1"; h2.name="홍2"; h3.name="홍3";
		hu1.name="홍4"; hu2.name="홍5"; hu3.name="홍6";		
		// 출력결과가 홍1 홍2 홍3 홍4 홍5 홍6 이다
		System.out.println("변경: ");
		System.out.println(h1.name+":"+h2.name+":"+h3.name);
		System.out.println(hu1.name+":"+hu2.name+":"+hu3.name);
	}

<추가 보충내용>

  • 만약에 Human클래스를 식별할 수 없으면 전체이름 기술.
  • 이 코드에서 com.human.ex.Human클래스가 있어서 Human h = new Human();의 경우 com.human.dto.Human인지 com.human.ex.Human인지 식별 불가능하여 문제 발생.

1) 클래스 선언방법

  1. 클래스의 패키지를 포함한 전체이름으로 생성
  2. 같은 패키지는 패키지 명을 생략하고 클래스이름만 사용할 수 있다.
  3. 다른 패키지일때, 긴 패키지명을 사용하고 싶지 않으면 import를 사용한다.
  4. import com.human.클래스 이름 혹은 .
    클래스 이름은 해당 클래스만 적용하고,
    은 해당 패키지에 있는 모든 클래스에 적용.
import com.human.dto.human;
import com.human.dto.*;
  1. import로 등록했다 하더라도 식별이 불가능하면 풀이름으로 클래스 명을 기술해야 한다.
    com.human.dto.human;과 com.human.ex.Human; Human 클래스가 있어서 식별이 불가능함. 그래서, import만 해도 전체이름으로 기술해야 함.
  2. com.human.ex.Human;를 삭제하고 실행하면 Human h = new Human(); 식별가능

(2) 참조형 데이터 클래스

  • 클래스는 관련 있는 데이터를 묶어서 메모리에 저장하는 사용자 정의 자료형이다.

1) 객체

  • 현실세계의 존재하는 모든 것.
  • 자바에서 프로그램을 구현할 때 관련있는 코드를 묶어서 객체로 표현.

2) 클래스

  • 관련 있는 코드들을 묶어서 프로그램을 구현한 것
  • int, double과 같은 기본 자료형이 표현할 수 없는 데이터를 기본 자료형을 묶어서 새로운 형태의 자료형 만들 수 있는 것이 클래스.
  • 사용자 일반 변수처럼 사용하면 되지만 자료의 크기가 명확하지 않아 new연산을 사용하여 실제 데이터를 힙 영역에 저장함.
  • 변수에는 실제 데이터가 들어 있는 메모리 번지수를 가지고 있음.
profile
IT 개발자가 되기 위한 기록

0개의 댓글