4월 11일 내용정리
1.컴터에서는 똑같은게 겹치면 제일 가까운걸 기준으로 잡는다.
아래와 같이 똑같은게 겹쳤을때 매개변수를 지역변수로 처리함
public Human(String name, int height, int weight) {
name=name;
height=height;
weight=weight;
}
이때 'this.변수명'을 써주므로써 전체클래스의 필드라는 의미를 알려줌.
public Human(String name, int height, int weight) {
this.name=name;
this.height=height;
this.weight=weight;
}
2.생성자 이름은 클래스이름과 같고, 리턴타입이 없다.
객체를 사용할수 있도록 세팅 시켜주는 역할을 한다.
공통적으로 쓰는 부분을 뽑아내서 설계도(클래스)를 작성한다.
3.클래스는 설계도이기 때문에 직접적으로 실행문을 쓸수 없다.
예)바로 System.out.println 를 쓸수 없음
왜냐면 필드와 메서드만 들어가 있어야 하기때문
직접 실행문은 메서드 안에 쓸수 있다.
설계도에서는 선언만한다.
4.this()
this() ->생성자가 자신의 생성자를 호출할수 있는것
생성자마다 아래 부분을 각각 생성해주는 과정이 번거로워 this() 를 써서
중복을 피한다.
참고로 'this.변수명' 과 this() 다르다.
public Human() {
name="홍길동";
height=170;
weight=80;
this("홍길동",170,80);
}
JVM은 OS에서 메모리(메모리영역:run time data area)를 할당받아 직접 관리해줌
(1)데이터영역
JVM이 시작될때 생성되며 바이트 파일 분석 할때 쓰는 데이터가 올라감.
모든 쓰레드가 다 갖다 쓰는 공통의 영역 부분이다.
(2)스택
스레드별로 생성이 되어 호출하고 작업이 끝나면 메모리에서 사라진다.
그림과 같이 클래스안에 메서드를 실행시
먼저 메인클래스실행->1번 메서드 실행 ->그안에 있는 1-1번 메서드를 실행후 ->1-1번 메서드사라지고->1번 메서드 사라지고->메인클래스가 스택영역에서 사라짐
(3)힙 영역
스택 영역에 hong이라는 참조변수를 만들고 힙에는 hong의 내용을 저장하고 주소값을 스택영역에 넘겨줌.
동적인 영역으로 객체나 배열 데이터가 들어가 있다.
힙에는 가비지컬렉터(GC)가 있어서 참조영역주소가 끊어지면 GC가 쓸모없는 메모리 영역으로 인식하고 정리해줌.
5.인스턴스 변수와 메서드
인스턴스변수:객체가 생성되어야지만 사용가능한 변수
인스턴스메서드:객체가 생성되어야 사용가능한 메서드
6.static
어떤객체나 클래스에 공통으로쓸때 static 을 쓴다.
예) 카드 너비와 길이등 공통적으로 쓸때 ->객체가 만들어 지지 않아도 사용이 가능하게 함(정적이다)
메모리영역에 static 만들어지기 때문(참고로 메모리 영역은 객체를 생성하는곳 객체대신 static이 메모리에 올라가는 개념같음...)
static 안에는 인스턴스변수, 인스턴스 메서드를 쓸수 없다. 왜냐면 인스턴스를 생성해야 쓸수있는 것들이므로
static변수는 상수를 쓸때 쓰임.
7.접급제어자
정보 은닉때 쓰임.
public->모두 들어와서 쓸수 있음.
private->자기 클래스안에만 접근 가능하며, 외부에서 접근못함.
8.getter 와 setter
private에 특정권한자만 접근할수 있게 열쇠와 자물쇠를 만드는데,
이걸 getter(읽어오기) 와 setter(값을 세팅)로 쓸수 있게 해주는것
사용 방법은 필드의 첫글자를 대문자로 쓰고, 메소드화함
접근제어자 void set필드명(){} ->값을 세팅만 하고 반환은 필요없으므로 void
접근제어자 리턴타입 get필드명(){}->값을 읽어와서 값을 반환해줘야 하기때문에 리턴 타입 필요
9.추상화
추상화는 현실 세계의 객체에서 불필요한 속성을 제거하고 중요한 정보만 클래스로 표현하는 일종의 모델링 기법이다.
public void setHakbun(int num) {
this.hakbun=num;
}
public int getHakbun() {
return hakbun;
}
선언 클래스
package study_0411;
public class Human {
/*필드 ; 이름, 신장, 체중
메서드; 살이찐다, 살이 빠진다.
1.설계도 만들기(가져다가쓸 클래스 작성) 2.메인클래스에 객체생성 3. 메인클래스에 초기화작업 4. 객체 사용하기
public 누구나 접근가능
*/
//필드
//객체를 선언할때 그때 메모리안에 올림
public String name;
public int height;
public int weight;
//생성자
//초기값을 고정시키고싶을때 알 모두 해당
//this()를 호출할때 가장첫줄에 쓴다. 쓰는 이유는 코드의 중복을 피하기위해.
public Human() {
this("홍길동",170,80);
// name="홍길동";
// height=170;
// weight=80;
}
//초기값을 고정시키고싶을때 this.weight 해당
public Human(String name, int height) {
this(name,height,70);
// this.name=name;
// this.height=height;
// this.weight=70;
}
//초기값을 외부에서 받을때
public Human(String name, int height, int weight) {
// this(name,height,weight);
this.name=name;
this.height=height;
this.weight=weight;
}
//메서드
//지역변수는 설정한 블럭의 실행문이 끝남과 동시에 같이 사라짐
//gweight 는 지역변수 이기때문에 위에 생성자의 지역변수와 다르다.
void gainWeight(int gweight) {
this.weight+=gweight;
System.out.println(this.name+"님은"+gweight+"kg만큼 살이쪄");
System.out.println("현재"+this.weight+"kg입니다.");
}
void reduceWeight(int rweight) {
this.weight-=rweight;
System.out.println(this.name+"님은"+rweight+"kg 만큼 살이 빠져");
System.out.println("현재"+this.weight+"kg입니다.");
}
// int->반환타입 reWeight, int->매개타입 rw
int reWeight(int rw) {
this.weight-=rw;
return this.weight; // 실행된 메서드를 빠져나와 나를 호출한 메인메서드로 값을 가지고 갈께
}
}
메인클래스
package study_0411;
public class Human_Test {
public static void main(String[] args) {
//객체 생성(인스턴스 생성)
/*1.데이터 영역에 Human 클래스를 만들고
* 2.스택 영역에 hong이라는 참조변수를 만들고
* 3.힙에는 hong의 내용을 저장하고 주소값을 스택영역에 넘겨줌*/
Human hong=new Human("홍길동",180,80);
Human kim=new Human("김자바",150,60);
System.out.println(hong.name);
System.out.println(hong.height+"cm");
System.out.println("이전 몸무게"+hong.weight+"kg");
System.out.println();
//hong이라는 객체로가서 Human클래스로 가서 거기서 gainWeight 메서드에 매개값5 를 넘겨주고 처리결과를 보여죠!!->메서드호출 과정
hong.gainWeight(5);
// 값을 가져다가 if문으로 처리 가능함
// if(hong.reWeight(10)>=80) {
// System.out.println("과체중");
// }else if(hong.reWeight(10)>=70) {
// System.out.println("적당");
// }else {
// System.out.println("저체중");
// }
//result반환타입을 응용하여 풀기
int result=hong.reWeight(10);
if(result>=80) {
System.out.println("과체중");
}else if(result>=70) {
System.out.println("적당");
}else {
System.out.println("저체중");
}
}
}
선언 클래스-1
package study_0411;
public class student {
//필드 선언
public int hakbun;
public String name;
public int kor;
public int eng;
// private int hakbun;
// private String name;
// private int kor;
// private int eng;
//메소드=>접근제어자 리턴타입 메소드명(){}
//접근제어자 void set필드명(){} 값을 세팅만 하고 반환은 필요없으므로 void
//접근제어자 리턴타입 get필드명(){}
public void setHakbun(int num) {
this.hakbun=num;
}
public int getHakbun() {
return hakbun;
}
//생성자
public student(int hakbun,String name, int kor,int eng) {
this.hakbun=hakbun;
this.name=name;
this.kor=kor;
this.eng=eng;
}
//메서드 선언
int hap(int kor,int eng){
int sum =this.kor+this.eng;
return sum;
}
double avg(){
double avg =(double)(this.kor+this.eng)/2;
return avg;
}
void printShow() {
System.out.println(this.name);
System.out.println(hakbun);
System.out.println(name);
System.out.println(kor);
System.out.println(eng);
}
}코드를 입력하세요
메인 클래스-1
package study_0411;
public class student_test {
public static void main(String[] args) {
// 객체생성=>인스턴스(객체)
//클래스타입 변수=new 클래스타입();
student gil =new student(123,"홍길동",90,95);
student ubin =new student(124,"김우빈",70,65);
student sugi =new student(125,"이수지",83,97);
//객체를 사용
//학생의 성적표 출력
gil.printShow();
ubin.printShow();
sugi.printShow();
}
}