개발 공부중

[TIL] 클래스와 인스턴스 본문

JAVA

[TIL] 클래스와 인스턴스

개발자 leelee 2022. 12. 6. 00:51
학습목표 : 인스턴스화를 설명할 수 있다.

 

우선, 클래스와 객체

클래스는 붕어빵 기계, 객체는 붕어빵에 비유할 수 있다.

클래스는 직접 사용할 수 없다. 클래스의 특징과 기능을 사용하기 위해서는 객체를 만든 후 사용해야된다.

클래스의 생성자로 객체를 만드는 과정을 인스턴스화 라고 한다.

*클래스의 객체 생성 방법
Car c = new Car();  // 클래스명 참조변수명 = new 생성자();

생성자는 반드시 클래스명과 동일한 이름이고, 리턴 타입이 없다.

 

* 객체 활용방법
c.print(); //참조 변수명.메소드명() //참조 변수명.필드명

 

두번째, 필드와 지역변수

필드는 설정하지 않아도 0, false, null로 초기화가 된다. 힙 영역에 위치하기 때문이다.

지역변수직접 초기화를 해줘야한다. 스택 영역이라 그렇다.

public class DeptVO {
    int deptno; //부서번호 선언시 초기값은 0
    String dname; //부서명 참조형 선언시 초기값은 null
    String loc; //지역명 참조형 선언시 초기값은 null

public class DepyVOMain {
    public static void main(String[] args) {
        DeptVO deptVO = new DeptVO();
        deptVO.deptno = 10;
        deptVO.dname = "개발1팀";
        System.out.println(deptVO.deptno); // 10
        System.out.println(deptVO.dname); // 개발1팀

        deptVO = new DeptVO(); // ☆ 변수 선언이 아니라 객체생성임!! ☆ 
        System.out.println(deptVO.deptno);  // ☆ 0 으로 초기화됨 ☆ 
        System.out.println(deptVO.dname);  // ☆ null 으로 초기화됨 ☆ 

        deptVO.deptno = 30;
        deptVO.dname = "개발2팀";
        System.out.println(deptVO.deptno);  // 30
        System.out.println(deptVO.dname);   // 개발2팀
    }
}

 

세번째, 메서드

클래스의 기능에 해당한다.

해당 내용은 아래 글 참고

https://mmee2.tistory.com/13

 

 

class Param{
    int ival; //전역변수는 초기화를 생략할 수 있다. 생성자가 해주니까. non-static //  = 0 -> 18번째 줄 100 -> 500
}             //but 지역변수는 반드시 초기화가 해야함, 스택에 살아서, 급이 class 급이 아니라서 

//선언부에 선언하면 전역변수 인스턴스변수.name << 전역변수
public class TestParam {  //선언은 되어 있는데 초기화는 안되어 있다.
    void effectParam(Param p){  // p는 주소번지 @abcd1234, p는 지변, (메소드 안에서 선언함) 선언만 되어 있고 생성이 안되어 있어서 (= NullPointerException)
        // ☆여기에 p = new Param()이 없으면 결과가 달라진다.☆
        p = new Param(); // 막혀있을 때는 paramp가 main안에 17번 원본을 참조함으로 원본을 500으로 초기화함 //p의 주소번지는 @abcd1235!!로 바뀌니까 복제본이 만들어짐으로 0이 500으로 바뀌는 것임 17번에 있는 p와 다름
        p.ival = 500;  //주소번지p 간접참조방식(사물함에 번호만 가지고 있음)
        System.out.println("sub ival ===> " + p.ival);
    }

    public static void main(String[] args) { //메인스레드가 시작점
        TestParam tp = new TestParam(); //인스턴스화  ////500
        Param p = new Param(); //6번에서는 선언만 했는데 여기서 생성함!! 원본에는 3번째줄 0이 들어있음  ////0
        //p.ival = 100;
        tp.effectParam(p); // 17번에서 만든 객체를 18번줄에서 씀 //주소번지 @abcd1234넘긴다 // 여기가 없으면 호출을 안해서 sub이 출력안됨
        System.out.println("main ival ===> " + p.ival); 
        
    }
    
}

인스턴스화(Param p = new Param();)를 하면 위치값(주소)가 새로 생성되는 것이다. 

Param()생성자로 만든 객체를 힙 메모리에 넣고, 위칫값을 Param타입의 참조변수 p에 저장하라고 표현할 수 있다.

 

public class String1 {
    public static void main(String[] args) {
        // String은 2가지로 초기화 가능함 대입연산자와 new를 사용하는 방법이 있음
        //s1과 s2의 주소번지는 같음
        //s3과 s4의 주소번지가 다름
        //s3이 가리키는 문자열 주소번지가 s4와 같은지를 비교하려면 equals()메소드를 활용
        //주소번지를 비교할 수 있는 것은 참조형 타입인 경우만 가능
        //원시형 변수는 주소번지를 비교할 수 없음
        
        String s1 = "안녕";
        String s2 = "안녕";
        String s3 = new String("안녕");
        String s4 = new String("안녕");
        System.out.println("s1과 s2 비교 ====> "+ (s1==s2));
        System.out.println("s2과 s3 비교 ====> "+ (s2==s3));
        System.out.println("s3과 s4 비교 ====> "+ (s3==s4));
        System.out.println("------------------------------");
        System.out.println("s1과 s2 내용비교 ====> "+ s1.equals(s2));
        System.out.println("s2과 s3 내용비교 ====> "+ s2.equals(s3));
        System.out.println("s3과 s4 내용비교 ====> "+ s3.equals(s4));
        
        //String 클래스는 new를 사용하지 않고 객체를 생성하면 이미 같은 값이 존재할 때 기존 값을 참조한다.
        //완결편 : 참조형 변수는 new를 사용하므로 무조건 새로운 객체가 만들어진다.
    }
}

String은 2가지로 초기화 가능하다. 대입연산자와 new를 사용하는 방법이 있다.

String 클래스는 new를 사용하지 않고 객체를 생성하면 이미 같은 값이 존재할 때 기존 값을 참조한다.

 

인스턴스화를 하지 않아도 메서드 앞에 static이 붙어 있으면 호출할 수 있다.

참조자료형이 넘겨지면 실제 객체가 전달되는 것이 아니라 객체의 위칫값이 전달되는 것이다.

 

'JAVA' 카테고리의 다른 글

[JAVA] 피보나치 수열 구하기  (0) 2022.12.07
[TIL] 배열  (0) 2022.12.07
[TIL] 변수/ return  (1) 2022.12.02
VScode 에서 java 프로젝트 생성하기  (0) 2022.12.01
[TIL] 변수선언 / 디버깅 방법  (0) 2022.11.29
Comments