Java - PT,RT

CYSSSSSSSSS·2024년 3월 23일
0

자바

목록 보기
14/26

Java

PTRT

기본형 vs 참조형 - 1

  • 변수에 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다.
  • 객체가 지정된 메모리의 위치를 가르키는 참조값으로 넣을 수 있는 참조형으로 분류할 수 있다.
  • 기본형(Primitive Type):int,long,double,boolean 처럼 변수에 사용할 값을 직접 넣을수 있는 데이터 타입 기본형
  • 참조형(Reference Type): 데이터에 접근하기 위한 참조 주소를 저장하는 데이터 타입을 참조형이라고 한다.(객체가 대표적)

기본형

  • 숫자 10,20 같은 실제 사용하는 값을 변수에 담을수 있다.
  • 기본형은 연산이 가능하다.
int a=10 , b=20;
int sum = a+b; 

참조형

  • 실제 사용하는 값을 변수에 담는 것이 아니다. 이름 그대로 실제 객체의(위치,주소)를 지정한다.
  • 참조형에는 객체와 배열이 있다.
  • 객체는 .(dot)통해서 메모리 상에 생성된 객체를 찾아가서 사용할 수 있다.
  • 배열은 []를 통해서 메모리 상에 배열을 찾아가야 사용할 수 있다.
  • 참조형은 기본형 처럼 연산이 불가능하다.

String

  • 클래스의 한 종류라 참조형 변수중 하나이다.

변수 대입

  • 자바의 대원칙 : 자바는 항상 변수의 값을 복사해서 대입한다.
  • 기본형,참조형 모두 변수에 있는 값들을 복사한다.
  • 기본형은 변수에 들어 있는 실제 사용하는 값을 복사해서 대입하고
  • 참조형이면 변수에 들어 있는 참조값을 복사해서 대입한다.
package ref;

public class Varchange1 {
    public static void main(String[] args) {
        int a = 10;
        int b = a;

        System.out.println("a = " + a);
        System.out.println("b = " + b);

        a = 20;
        System.out.println("a = " + a); // 20
        System.out.println("b = " + b); // 10

        b = 30;
        System.out.println("a = " + a); // 20
        System.out.println("b = " + b); // 30

    }
}
  • 변수의 대입은 변수의 값을 복사해서 대입하는 구조이다
  • 첫 번째 b의 값을 a로 지정하는 것은 a 자체를 가져오는게 아니라 a의 값을 복사하는 것이다.
  • 이후에 a값과 b의 값을 변경하는 것은 본인의 자체의 값을 변경하는 것이다.a를 바꿨다 해서 b가 바뀌는것은 아니다.
package ref;

public class Data {
    int value;
}
package ref;

public class Varchange2 {
    public static void main(String[] args) {
        Data dataA = new Data();
        dataA.value = 10;
        Data dataB = dataA; //B객체의 참조 주소를 A로 변경

        System.out.println("dataA = " + dataA);
        System.out.println("dataB = " + dataB);
        System.out.println("dataA = " + dataA.value);
        System.out.println("dataB = " + dataB.value);
        
        dataA.value = 20;   // 참조되는 값이 변경 됐기 때문에 B도 변경
        System.out.println("dataA = " + dataA.value);
        System.out.println("dataB = " + dataB.value);
        
        dataB.value = 30;   // A랑 B가 같은 주소를 가르키기 때문에 두개의 값이 바뀐다.
        System.out.println("dataA.value = " + dataA.value);
        System.out.println("dataB.value = " + dataB.value);
    }
}
  • 참조형 변수는 주소를 가르키기 때문에 같은 주소의 공간에서 값이 바뀌면 두개의 변수가 바뀐다.

메서드 호출

  • 메서드 호출도 매개변수도 역시 변수의 하나이다.
  • 호출 시 매개변수의 값을 전달하는 것도 복사해서 전달하는 구조이다.
package ref;

public class MethodChange1 {
    public static void main(String[] args) {
        int a = 10;

        System.out.println("메서드 호출전 a: " + a);
        changePrimitive(a);
        System.out.println("메서도 호출후 a: " + a);

    }

    public static void changePrimitive(int x){
        x = 20;
    }
}
  • 값을 복사해서 전달하는 구조이기 때문에 x = 10;
  • 하지만 함수 내에서 x만 20으로 바뀌는 구조이기 때문에 a가 바뀌지는 않는다.
package ref;

public class MethodChange2 {
    public static void main(String[] args) {
        Data dataA = new Data();
        dataA.value = 10;

        System.out.println("dataA = " + dataA.value);
        changeRefernece(dataA);
        System.out.println("dataA = " + dataA.value);
        
    }
    public static void changeRefernece(Data data){
        data.value = 20;
    }
}
  • 참조형 변수도 주소를 가르키기 때문에 같은 주소의 값을 변경하면 값이 바뀐다.
  • 즉 함수안에 data라는 변수는 dataA의 주소를 가르킨다.

활용

package ref;

public class Method1 {
    public static void main(String[] args) {
        Student student1 = new Student();
        initStudent(student1 , "학생1" , 15 , 97);
        Student student2 = new Student();
        initStudent(student2 , "학생2",19 , 90);

        printStudent(student1);
        printStudent(student2);
    }

    static void initStudent(Student student , String name , int age , int grade){
        student.name = name;
        student.age = age;
        student.grade = grade;
    }
    static void printStudent(Student student){
        System.out.println("이름:" + student.name + " 나이: " + student.age + " 성적: " + student.grade);

    }
}
  • 메서드에 값을 넣어서 클래스 객체의 데이터를 초기화 하는 예제이다.
  • 첫 번째로 Student 객체를 호출하고 객체는 참조형 이기때문에 주소형이 넘어간다.
  • 나머지 매개변수들은 기본형 이기때문에 값 자체가 복사된다.

클래스 초기화 함수

  • 클래스 자체를 함수로 만들어 선언을 최소화 할수 있다.
package ref;

public class Method2 {
    public static void main(String[] args) {
        Student student1 = createStudents("학생1" , 15 , 97);
        Student student2 = createStudents("학생2",17 , 90);

        printStudent(student1);
        printStudent(student2);
    }

    static Student createStudents(String name , int age , int grade){
        Student student = new Student();
        student.name = name;
        student.age = age;
        student.grade = grade;
        return student
    }

    static void printStudent(Student student){
        System.out.println("이름:" + student.name + " 나이: " + student.age + " 성적: " + student.grade);

    }
}
  • 선언을 할때 함수 내에서 선언을 하고 반드시 초기화를 완료된 객체를 리턴해야 한다.
  • 리턴을 해야하는 이유는 함수 내에서 객체를 선언 했기 때문에 함수 밖에서 사용하기 때문에 값을 반환 해줘야 한다.

변수와 초기화

변수의 종류

  • 멤버 변수(필드): 클래스에 선언
  • 지역 변수: 메서드의 선언,매개변수도 지역변수의 한종류이다.
public class Student[
	String name;
	int age;
    int grade;
}
  • name , age , grade는 멤버 변수이다.
public class ST3{
	public static void main(String[] args){
    	Student student1;
        student1 = new Student();
        Student student2 = new Student();
    }
}
  • student1,student2는 지역변수이다.
package ref;

public class MethodChange1 {
    public static void main(String[] args) {
        int a = 10;

        System.out.println("메서드 호출전 a: " + a);
        changePrimitive(a);
        System.out.println("메서도 호출후 a: " + a);

    }

    public static void changePrimitive(int x){
        x = 20;
    }
}
  • a,x 역시 매개변수(지역변수)이다.

변수의 값 초기화

멤버 변수

  • 자동 초기화
  • 인스턴스를 생성할때 자동으로 초기화 한다.
  • 개발자가 초기값을 지정할 수 있다.
  • 숫자는 0,boolean은 false, 참조형은 null로 초기화 한다.
  • null은 참조할 대상이 없다는 뜻으로 사용된다.
package ref;
public class InitData { // 멤버 변수
    int value1; // 초기화 하지 않음
    int value2 = 10;//10으로 초기화
}
package ref;
public class InitMain {
    public static void main(String[] args) {
        InitData data = new InitData();
        System.out.println(data.value1); // 초기화 안한 값
        System.out.println(data.value2); // 초기화 한 값
    }
}
  • value1은 초기화 하지 않아서 0출력 value2는 초기화 해서 10그대로 출력

지역 변수

  • 수동 초기화
  • 사용자가 직접 초기화 해야함

null

  • 참조형 변수에서 항상 객체가 있는 위치를 가리키는 참조값이 들어간다. 하지만 카리키는 대상을 나중에 입력하고 싶으면 어떻게 해야 할때 null을 사용한다.
package ref;

public class NullMain1 {
    public static void main(String[] args) {
        Data data = null;
        System.out.println("1. data = " + data);
        data = new Data();
        System.out.println("2. data = " + data);
        data = null;
        System.out.println("3. data = " + data);
    }
}

  • data 를 중간에 null로 초기화 해도 null로 바뀐다.
  • null로 바뀌면 기존에 참조된 값도 알수가 없다.

NullPointerException

  • 참조값 없이 객체를 할당할 경우 발생하는 에러이다.
package ref;

public class NullMain2 {
    public static void main(String[] args) {
        Data data = null;
        data.value = 10;
        System.out.println(data.value);
    }
}
  • 참조값이 없는데 객체의 값을 할당 할수가 없다(nullpointerexception)

멤버 변수가 null

package ref;

public class BigData {
    Data data;
    int count;
}
package ref;

public class NullMain3 {
    public static void main(String[] args) {
        BigData bigData = new BigData();
        System.out.println(bigData.count);
        System.out.println(bigData.data);
        System.out.println(bigData.data.value);
    }
}
profile
개발자 되고 싶어요

0개의 댓글

관련 채용 정보