JAVA 07 객체지향 프로그래밍(1)
반응형
클래스와 객체
클래스 - 객체를 정의해 놓은 것 or 사용자 정의 타입
- 객체를 생성하는데 사용
- Hello h = new Hello();
- h의 타입은 Hello
- 그럼 Hello에 뭘 담지? → 존재하는 모든 것(객체, 정하기 나름)
객체 - 실제로 존재하는 것. 사물 또는 개념
- 객체가 가지고 있는 기능과 속성에 따라 다름
인스턴스화_instantiate(객체를 만드는 과정, 메모리에 올리는 것) - new, static
- new : 사용자가 올린다
- static : 시스템이 자동으로 올린다
인스턴스_instance - 어떤 클래스로부터 만들어진 객체
객체 = (속성 + 기능)의 집합
- 속성 _property: 멤버변수
- 기능 _function: 메서드
인스턴스 생성 방법 - new
1 2 | Tv t; //Tv클래스 타입의 참조변수 t를 선언 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 |
반응형
'development' 카테고리의 다른 글
JAVA 09 객체지향 프로그래밍(3) (0) | 2017.12.27 |
---|---|
JAVA 08 객체지향 프로그래밍(2) (0) | 2017.12.27 |
JAVA 06 배열/스트링/콜렉션 (0) | 2017.12.27 |
JAVA 05 배열 (0) | 2017.12.27 |
JAVA 04 반복문(While) (0) | 2017.12.27 |
댓글
이 글 공유하기
다른 글
-
JAVA 09 객체지향 프로그래밍(3)
JAVA 09 객체지향 프로그래밍(3)
2017.12.27 -
JAVA 08 객체지향 프로그래밍(2)
JAVA 08 객체지향 프로그래밍(2)
2017.12.27 -
JAVA 06 배열/스트링/콜렉션
JAVA 06 배열/스트링/콜렉션
2017.12.27 -
JAVA 05 배열
JAVA 05 배열
2017.12.27