-
210419_5~6(chapter9.메모리운영,객체구별,기본생성자)JAVA(Sol)(정리대기중..언젠가) 2021. 4. 19. 15:20
메모리운영
Hi.java
public class Hi{
int a ;
int b;
public int add(int a, int b ){
return a+b;
}
public static void main (String [] args){ //객채를생성하지않고 jvm이 main을 직접호출한다
------비교---------
public void main (String [] args){ //main이 멤버메서드가 되므로 객체를 생성해야 호출할수있다.
HI hi = new Hi ( ); //그런데 객체를 생성하는 코드가 메인 함수 내부에 있음..
//hi.main() ; //모순발생 <== static이 없을때
hi.a = 100;
hi.b = 200;
sysout(hi.add(a,b)) ;
}
}
-----------------------------------Hi.class 를 실행하면 아래처럼 메모리에 로드된다.
-----------------------------------code segment
Hi.class 소스가 로드된다.
------------------------------------static : data segment : static키워드가 일반적으로 붙음
상수=초기값, 클래스변수 <==static 변수 1.로드할때 바로 메모리 할당받음 2.객체(인스턴스)를 생성하지않고 사용한다.
static함수 main 함수 {
3.실행속도가 빠르다.
Hi hi = new Hi();
//hi = 1234567 라는 레퍼런스값을 가지고있다 4. 호출식 객체.변수(X), 클래스.변수(O)
hi.a =99; 5.클래스변수는 다른 클래스에서 사용가능하다.(전역변수보다 더 넓은개념)
hi.b=11; 6.객체 생성후 사용하는 this나 super는 static함수에서 사용불가능하다.
hi.add() ; // 함수실행의 결과는 나중에 사용하려면 heap영역에 저장해야한다-> hi.c= hi.add();
hi = null;// 더이상 heap을 참조하지않는다
}
---------------------------------------------------------------code+data ==> method area(java), class area
----------------------------------- heap객체영역 : 멤버변수들, 함수명 1.new와 생성자에 의하여 할당받는 영역
2.hashcode에 의한 reference 참조
| a(=99) | b(=11) | add() | 0001010100 address<==JVM:해쉬테이블 매핑==>1234567
3. 그래서 c++언어에 비하여 속도가 느리다
4.비교적 지속성이 크다.
5.나중에 한가할때 참조되지 않는 heap을 수거한다 : gavage collection
이라고한다. ==>heap영역을 자동으로 관리한다.
-----------------------------------stack
메서드 실행영역 ( 지역변수)
스택특징
- 1. LiFO : Last in First out 나중에 입력된 것이 먼저 나오는 구조.
- 2.함수가 종료되면 곧바로 메모리반납 : AutoCollection
- 3. 순간적인 영역
a () { } //in a out a
b () { // in b
c() { //in c
d( ) { } // in d out d
} //out c
} //out b
메모리수명
static (프로그램과 수명이같다) > heap(gc로) > stack(자동반납)
package chapter9; class HashCodeTest { int kuk = 12; int eng = 45; public void prn() { System.out.println("kuk :" + kuk); } } class HashCodeTest2 { int kuk = 56; int eng = 78; public void prn() { System.out.println("kuk" + kuk); } } public class HashCodeTestMain { public static void main(String[] args) { HashCodeTest hct1 = new HashCodeTest(); // 기본생성자의 호출 HashCodeTest hct2 = new HashCodeTest(); HashCodeTest2 hct3 = new HashCodeTest2(); // hashcode() System.out.println("hct1.hashcode:" + hct1.hashCode()); System.out.println("hct2.hashcode:" + hct2.hashCode()); System.out.println("hct3.hashcode:" + hct3.hashCode()); System.out.println(hct1.kuk); System.out.println(hct1.eng); // System.out.println(hct1.prn); System.out.println(hct3.kuk); System.out.println(hct3.eng); // System.out.println(hct3.prn); } // 객체를 구별하는 요소는 재료가 아니라 영역이다. }객체구별
재료가 같다고 같은 객체가 아니라 영역이 같아야 같은 객체이다.
기본생성자
1.인자가 없는 생성자.
2.클래스안에 생성자 정의가 없으면, 인스턴스생성시 기본생성자가 자동으로 생성되어 호출된다.
3.하디만 숙달(상속관계이해)되기 전까지는 가능하면 기본생성자를 기술하자.
package chapter9; class MethodTest { int kuk = 0; int eng = 0; int tot = 0; float avg = 0.0f; public MethodTest() { // 기본생성자(파라미터가없는생성자) } //클래스안에 생성자 정의가 없으면, 인스턴스 생성시 기본생성자가 // 자동으로 생성되어 호출된다. public int getTot() { return tot; } public float getAvg() { int avg_round = 0; avg_round = (int) (avg + 0.5); return avg_round; } public void setKuk(int kuk) { this.kuk = kuk; } public void setEng(int eng) { this.eng = eng; } public void calcTot() { tot = kuk + eng; } public void calcAvg() { avg = tot / 2.0f; } public void prn() { System.out.println("국어:" + kuk); System.out.println("영어:" + eng); System.out.println("총점:" + tot); System.out.println("평균:" + avg); } } public class MethodTestMain9 { public static void main(String[] args) { MethodTest mt = new MethodTest(); // 기본생성자호출 mt.setKuk(95); mt.setEng(80); mt.calcTot(); mt.calcAvg(); System.out.println("총점 :" + mt.getTot()); System.out.println("평균 :" + mt.getAvg()); } }'JAVA(Sol)(정리대기중..언젠가)' 카테고리의 다른 글
210420_1~2(static변수,singleton pattern,final) (0) 2021.04.20 210419_7~8 (생성자오버로딩) (0) 2021.04.19 210419_3~4(getter,setter) (0) 2021.04.19 210419_1~2call_by_value,생성자 (0) 2021.04.19 210416_7(method만들기) (0) 2021.04.16