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
1) 기본 자료형
- 크기가 정해져 있는 자료형
- 기본 자료형 변수가 가리키는 주소의 메모리 위치에 데이터가 존재.
- 저장공간에서 상자안에 데이터가 있다면 기본 자료형.
2) 참조 자료형
- 크기가 정해져 있지 않는 자료형
- 참조 자료형 변수에는 주소의 메모리 주소데이터 존재.
- 기본 자료형과 참조 자료형을 분리하는 이유는 속도 향상.
- 즉, 크기가 일정한 기본자료형과 참조자료형의 주소는 접근성이 용이한 스택이라는 메모리에 저장.
- 일정하지 않은 참조형 자료형의 실제 데이터는 힙에 저장.
힙과 스택 보충설명
(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)가 동작하여 참조하지 않는 객체 제거.
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개를 생성하려면 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); } }
- 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) 클래스 선언방법
- 클래스의 패키지를 포함한 전체이름으로 생성
- 같은 패키지는 패키지 명을 생략하고 클래스이름만 사용할 수 있다.
- 다른 패키지일때, 긴 패키지명을 사용하고 싶지 않으면 import를 사용한다.
- import com.human.클래스 이름 혹은 .
클래스 이름은 해당 클래스만 적용하고, 은 해당 패키지에 있는 모든 클래스에 적용.import com.human.dto.human; import com.human.dto.*;
- import로 등록했다 하더라도 식별이 불가능하면 풀이름으로 클래스 명을 기술해야 한다.
com.human.dto.human;과 com.human.ex.Human; Human 클래스가 있어서 식별이 불가능함. 그래서, import만 해도 전체이름으로 기술해야 함.- com.human.ex.Human;를 삭제하고 실행하면 Human h = new Human(); 식별가능
- 클래스는 관련 있는 데이터를 묶어서 메모리에 저장하는 사용자 정의 자료형이다.
1) 객체
- 현실세계의 존재하는 모든 것.
- 자바에서 프로그램을 구현할 때 관련있는 코드를 묶어서 객체로 표현.
2) 클래스
- 관련 있는 코드들을 묶어서 프로그램을 구현한 것
- int, double과 같은 기본 자료형이 표현할 수 없는 데이터를 기본 자료형을 묶어서 새로운 형태의 자료형 만들 수 있는 것이 클래스.
- 사용자 일반 변수처럼 사용하면 되지만 자료의 크기가 명확하지 않아 new연산을 사용하여 실제 데이터를 힙 영역에 저장함.
- 변수에는 실제 데이터가 들어 있는 메모리 번지수를 가지고 있음.