06. 객체지향 구현
클래스와 객체 그리고 인스턴스
getter & setter
getter -> 값을 반환하는것
setter -> 값을 변경하는것
package com.ruby.java.ch06;
public class Armor {
private String name;
private int height;
public String getName(){
return name;
}
public void setName(String value){
name=value;
}
public int getHeight(){
return height;
}
public void setHeight(int value){
height=value;
}
}
new Armor();
new Armor();
new Armor();
//객체 생성
인스턴스
정의된 클래스들을 실제 메모리에 만든것
힙(heap)
자바에서 사용하는 메모리는 3가지 영역이 있다.
코드 , 힙 , 스택
new 클래스명()* 을 만들때 new 는 heap에서 만드는 것이다.
new Armor(); --> heap memory
실제로 heap memory에 메서드 영역은 안만들어 진다. 메서드는 코드영역에 만들어 진다. heap에서는 필드만 만들어짐 Amor(name,height) 이부분만
스택(stack)
지역변수 --> 메서드가 호출되어 실행될 때 스택에 생성된다.
public int sum(int data1, int data2){ // <- 지역변수
int data=data1+data2;
return data
}
sum(10,2);
위에 이렇게 선언하면 스택에 생성된다.
-> 메서드가 종류가 되면 자동으로 삭제가 된다.
필드 초기화
기본변수들은 전부 0으로 , 제외한 나머지인 참조변수는 null로 초기화 된다.
지역변수는 초기화가 안된다 ---> 반드시 선언하고 초기화 한다음에 써야한다.
참조변수를 이용해 인스턴스에 접근
자바 프로그램은 힙메모리에 직접 접근할 수 없다. 오직 스택에 직접 접근할 수 있다.
---> 스텍메모리에 참조변수를 선언하고 이 변수에 힙 메모리에 생성된 인스턴스에 어떤 정보를 저장해서 접근하는 방식을 사용한다.
p223
a1 : 참조변수 (주소 값을 가지고 있음) --> 스택에 만들어짐
stack | heap |
---|---|
(Armor) a1 -------- (Armor) a2 -------- | --->Armor(name:null | height : 0) --->Armor(name:null |height:0) |
Armor a1 = new Armor();
stack에 만들어진 참조변수 = heap에 만들어진 메모리
(위 Armor예시코드 참조)
a1.setName("mark6")
참조변수 a1에 있는 heap memory 주소값을 가서 setName이라는 인스턴스에 접근할 수 있음
String n1 = a1.getName();
위에서 setName작업을 통해 name에 mark6이라고 저장되어있는값을 참조변수 a1에 있는 heap memory 주소값을 가서 getName을 통해 가져와서 String type의 n1에 넣어라!
a1= null;
Garbage Collector
stack과 heap 메모리에서 Armor와의 참조가 끊켰다면 garbage가 된다.
JVM이 Garbage Collector 에게 힙메모리 돌아다니면서 참조가 끊긴 메모리들을 돌아다니면서 지워준다.
정적 멤버 선언
지역,멤버변수 정리
지역변수
메서드 안에서 선언된 변수
stack
메서드 호출시 생성된다.
메서드 종료시 삭제된다.
클래스 ,객체의 특성을 필드,멤버변수에 나타낸다.
멤버변수(필드) (=인스턴스 변수)
객체의 속성을 나타내는 변수
heap
객체 생성시 =인스턴스 생성=> new
참조가 끊긴후 garbage collector에 의해 삭제된다.
메서드에서나타내기위해 쓴다.
멤버변수(클래스변수)
static 이라고 선언되어 있다면 멤머변수 중에서도 클래스 변수라고 한다.
code 라는 메모리 영역을 쓴다.
프로그램 시작할 때 자동으로 만들어진다.
프로그램 종료시 자동으로 삭제가된다.
인스턴스 vs 클래스?
static 유무에 따라 다르다
한 파일안에 클래스를 여러개 정의해도 괜찮다. public 이 붙어있거나 main 메소드가 있는애들에 public 을 주면 된다.
count.class
countTest.class ...하지만 컴파일 하면 public 한 애들은 .class 단위로 만들어진다.
파일명으로 만들 파일만 public 으로 써놓으면 그 파일만 .class로 만들어진다.
class Count{
public static int totalCount; //클래스 변수
int count; //인스턴스 변수
}
main 함수에서 호출이 된다면, main 이 실행하기 전 시점에 static 이 붙어져 있는 애를 코드영역에 메모리를 만든다.
p233
stack | heap | code |
---|---|---|
c1----> | Count(totalCount : ----- |count:0 ) | --->Count (totalCount:0) |
앞전에 만들었던 code에서의 정보를 가지고 있어서 새로 초기화 값을 만들지 않는다.
vs
인스턴스 변수는 new 할때마다 인스턴스값 자체가 하나씩 만들어진다.
클래스 변수는 하나만 만들어져 초기화 된다
*공통으로 사용하는 변수일 때 static 변수로 사용하면 좋다.
code영역 static 으로 만들어져 있는것은 참조영역 필요 없다. 바로 접근할 수 있다.
why?
main이 만들어지기전에 변수가 만들어 지기 때문
Count.totalCount++;
// 클래스 변수
Count c1 = new Count();
c1.count;
//인스턴스변수
메서스 앞에서도 만들 수 있다.
클래스명. 메서드명
package test1;
public class CountTest {
public void count1{
System.out.println("hello1");
}
public static void count2{
System.out.println("hello2");
}
public static void main(String[] args) {
CountTest.cout1(); // static을 선언하지 않았으므로 오류가난다.
CountTest.cout2();
}
}
p243 오류 참고
정적 코드 블록
static {
System.out.println("hello1");
System.out.println("hello2");
}
프로그램 실행하기전에 실행되게 만들 수 있다.
생성자
public class Member{
private String name;
private int age;
public Member(){
}
//에러?가 날까?
}
리턴타입이 없다 그래서 일반적으로 오류! 하지만 클래스 이름이랑 같아서 생성자라고 생각한다.
인스턴스 생성자 개요
인스턴스 생성시 자동으로 생성되는 함수
반환값이 없다
클래스이름과 같아야한다.
대문자로 시작
역할
필드의 초기화를 담당한다.
public Member(){
System.out.println("생성자 호출 ");
name= "no name";
age =20;
} //초기화
기본생성자
매개변수가 없는 생성자를 기본생성자라고 한다.
stack 은 자기 메서드 영역에서 변수를 찾을 수 밖에없다.
P252
stack | heap |
---|---|
second( i=4 | j=5 | this----)--- first(i = 2 | j= 3| this----)----- main : exam---------------------- | -------> -------> |ThisTest( i=1 | first() | second() ) | -------> |
영역 구분을 하자마자 this라는 것은 바로 만들어 진다. 이 this 는 현재실행중인 인스턴스의 참조값을 가리킨다.
그러므로 this.i 라는 말은 ThisTest에 있는 i를 가리킨다.
생성자 호출
생성자안에서 다른 생성자 호출이 가능하다.
this() ---> 나의 다른생성자 호출할 때 쓰는것
why ? 객체지향적으로 사용하려고 (왠만하면 중복되는 코드 제거하고 하나로 만들어라)
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
08. 다형성과 내부클래스 (0) | 2019.02.11 |
---|---|
07. 상속과 인터페이스 (0) | 2019.02.08 |
05.객체지향 (0) | 2019.02.07 |
04. 배열 (0) | 2019.02.07 |
03. 제어문 (0) | 2019.02.07 |