Puter의 잡동사니

클래스와 객체

클래스 - 객체를 정의해 놓은 것 or 사용자 정의 타입
  • 객체를 생성하는데 사용

  • Hello h = new Hello();
  • h의 타입은 Hello
  • 그럼 Hello에 뭘 담지? → 존재하는 모든 것(객체, 정하기 나름)

객체 - 실제로 존재하는 것. 사물 또는 개념
  • 객체가 가지고 있는 기능과 속성에 따라 다름

인스턴스화_instantiate(객체를 만드는 과정, 메모리에 올리는 것) - new, static
  • new : 사용자가 올린다
  • static : 시스템이 자동으로 올린다

인스턴스_instance - 어떤 클래스로부터 만들어진 객체

객체 = (속성 + 기능)의 집합
  • 속성 _property: 멤버변수
  • 기능 _function: 메서드

인스턴스 생성 방법 - new
1
2
Tv t;               //Tv클래스 타입의 참조변수 t를 선언
= new Tv();       //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
cs

1
Tv t = new Tv();
cs
 
 
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
 

변수와 메서드

참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이 상의 참조변수가 하나의 인스턴스를 가리키는 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 불가능.
  • 식권 하나로 식판 하나 떠서 나눠먹을 수 있는데, 식판 2개는 못가져감

클래스 변수(static) - 프로그램 실행 시킬 때 자동으로 메모리에 올라감.
  • 클래스와 함께 행동(클래스가 로딩될 때 생성, 종료되면 소멸)
  • 같은 클래스의 모든 인스턴스들이 공유하는 변수
  • 클래스이름.클래스변수명 (Ch04.calc)으로 접근

인스턴스 변수(new) - 주소를 가지고 올라감.
  • 먼저 인스턴스를 생성해야한다. (인스턴스화 - new로 사용하여 접근)
  • 클래스에 주소가 만들어졌을 때 생성
  • 각 인스턴스의 개별적인 저장공간
  • 인스턴스마다 다른 값 저장 가능

지역변수 - 메서드 안에서 사용된다.
  • 메서드의 종료와 함께 소멸
  • {블럭}을 벗어나면 소멸

종류
선언 위치
주소 생성시기
클래스 변수
class variable
클래스 영역
클래스가 메모리에 올라갈 때
인스턴스 변수
instance variable
클래스 영역
인스턴스가 생성되었을 때
지역 변수
local variable
클래스 영역 이외의 영역
(메서드, 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class Ch06ClassVar {
 
    //전역 변수 --> 인스턴스 변수/클래스 변수
    
    //클래스 변수 : 클래스 실행 시 자동으로 인스턴스화(static)
                //(클래스 구동 여부와 같다.)
                //메모리 공간 공유
                
    //인스턴스변수 : 인스턴스화(new) 해야 사용 가능
                //새로운 주소 : 각자의 메모리 공간
    
    int iv = 1;            //instance variable, need new
    static int cv = 9;     //class variable
    int lv = 0;            //instance variable, need new
    
    public int add(int a) {
        int lv = 99;       //local variable
        
        Ch06ClassVar vv = new Ch06ClassVar(); 
        //참조변수 vv로 Ch06ClassVar 클래스를 인스턴스화
        
        System.out.println(this.cv); //111, 여기서 this는 add메서드를 호출한 녀석의 주소
        System.out.println(vv.iv); //1
                
        System.out.println(lv); //99
        
        System.out.println(lv + a); //99 + 4 = 102
        
        return a + 1;
    }
    
    
    public static void main(String[] args) {
        //지역 변수 - 반드시 초기화
        //메서드 실행될 때 메모리에 올라가고
        //메서드 종료 시 메모리 해제
        
        System.out.println(cv); //9
        
        System.out.println(Ch06ClassVar.cv); //9
        //System.out.println(Ch06ClassVar.iv); //error - new해야 함
        
        Ch06ClassVar ins1 = new Ch06ClassVar(); 
        //new로 인스턴스화
        System.out.println(ins1.iv + " " + ins1.cv); //1 9
        
        Ch06ClassVar ins2 = new Ch06ClassVar(); 
        //new로 인스턴스화
        System.out.println(ins2.iv + " " + ins2.cv); //1 9
        
        ins1.iv = 888//인스턴스 변수 iv에 888 대입
        System.out.println(ins1.iv); //888
        System.out.println(ins2.iv); //1, ins2의 iv는 영향 없음
        
        ins1.cv = 111//클래스 변수 cv에 111 대입
        System.out.println(ins2.cv); //111
        System.out.println(ins2.cv); //111, 클래스 변수라서 모두 영향
        
        /*============*/System.out.println();/*============*/
        
        int res = ins1.add(3);
        System.out.println(res); //4
    }
}
cs


매개변수(파라미터)도 지역변수

지역 변수와 전역 변수의 이름이 같아도 상관 없음.
  • 각자 알아서 가는 걸로

인스턴스 변수와 지역 변수를 구별하기 위해 참조 변수 this 사용
  • 클래스 내에서 지역 변수가 초기화를 안해주면, this를 못 씀.


<JVM 메모리 구조>
메서드 영역(method area) - 클래스에 대한 정보(클래스 데이터)를 저장
  • 클래스변수도 함께 생성

힙(heap) - 인스턴스(주소)가 생성되는 공간
  • 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에서

호출스택(call stack/execution stack) - 메서드의 작업에 필요한 메모리 공간 제공



생성자

생성자(Constructor) = 값의 초기화
1. 대소문자 규칙 - 대문자 가능
2. 클래스 이름과 동일
3. () : 기본생성자
4. (String a, int b) : 매개변수(파라미터)가 있는 생성자 
5. 생성자가 클래스 내에 단 하나도 없으면 기본 생성자를 자동으로 만들어 준다.
  • 생성자가 하나라도 있으면 기본 생성자는 만들어지지 않는다.
1
public Ch06Constructor() {} 
cs

6. 리턴타입 여부 : 생성자는 리턴타입이 없다.


this - 인스턴스 자신을 가리키는 참조변수
  • 인스턴스의 주소가 저장되어 있음
  • 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
  • static안에서 this 사용 금지 
  •     → this는 new를 써야 생기는데, 인스턴스화(new)가 언제 될지 모르니까
  •     Cannot make a static reference to the non-static field Ch06ClassVar.lv
  • 인스턴스 변수(new를 사용하는)랑 사용 가능

this() - 해당 클래스의 자기 자신 생성자 호출 메서드
  • 클래스의 객체를 생성했을 떄, 자기자신의 생성자를 호출
  • this()는 항상 첫 줄에 사용 (super()와 겹치면 new를 사용해보자)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Ch06Constructor {
 
    public Ch06Constructor() {      //기본 생성자
        System.out.println("1111");
    }
    public void Ch06Constructor() { //메서드
        System.out.println("2222");
    }
    
    public void myPrint(String...strings) {
        for (int i = 0; i < strings.length; i++) {
            System.out.println(strings[i]);
        }
        System.out.println("OK");
    }
    
    public static void main(String[] args) {
  
        Ch06Constructor c = new Ch06Constructor(); //1111
    
        c.Ch06Constructor(); //2222
    
        c.myPrint("aa""bb");
    
        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}
cs



댓글 로드 중…

블로그 정보

잡다한 것이 한데 뒤섞인 곳

최근에 게시된 글