22.11.04 클래스 인스턴스화 심화2 및 오버로딩 오버라이딩 개념
오버 라이딩.. 상속 개념과 접목 시켜서 생각해야한다.
부모가 클래스에서의 메소드가 자식클래스에 상속되었으나 자식 입장에서 상속받은 메소드를 자신에게 더 적합한 형태로 뜯어고쳐 사용하는 것을
오버라이딩이라고 한다.
오버로딩 클래스와 동일한 메소드는 1개만 존재해야하나 그게 여러개가 있어서 오버로딩이라는 개념이 된다.
Overloading은 클래스 객체화와 관련이 있고 Overriding은 상속 개념에서 적용된다.
//이 클래스는 자동차 클래스이다.
/*
클래스 멤버라하면 필드와 메소드로 구성되어있다고 얘기한다.
클래스 문법
[접근제어자][제어자] class 클래스명
class 클래스{
field- 데이터 터가 필요한 타입 변수
//[]는 생략 가능 한 것들
//field-데이터 = 전역변수
//[접근제어자] [제어자] 타입 변수(필드)명 [ = 초기값;] 초기값 생략 가능
method()-기능, 동작을 수행
//리턴유형 메소드명(){수행하고자하는 동작, 구현코드}
//method-기능, 행위, 동작
//[접근제어자] [제어자] 리턴유형 메소드명(){};
- 리턴 할 것이 없다.---> void
- 정수, 실수, char, boolean, String, String[] 등
} - /
field-데이터
String name = "송준호"; //이름
String country = "대한민국" //국적
String gender = "남자" //성별
int age = 36; //나이
double weight = 77.2; //몸무게
double height = 173.2; //신장
String job = "실업자";
String Addr = "경기도 성남시 중원구 은행동 2228, 301호"
method(){}
본다.
먹는다.
잔다.
말한다.
걷다.
달리다.
//위와같은 경우 때문에 변수타입 변수명 값을 분리해서 선언
double height1 = 170.5;
int height2 = (int)170.5; //강제로 인트타입으로 컨버트(강제 형변환)
//실수타입의 value를 int타입으로 강제형변환하면서 값의 손실이 발생
//(강제형변환타입)변수명
//float height3 = (float)170.5; -->이것도 강제 형변환
float height3 = 170.5f; //위와 결과 동일
//위와같은 방식을 리터럴형변환방식 이것은 F, f, D, d로 사용
//실수: float, double(기본)
//float와 double의 차이
//유효자릿수 가 뜻하는 것은 정밀도 를 뜻합니다. 즉, 몇자리 까지 오차없이 표현할 수 있는가입니다.
//float은 7자리(4바이트), double은 15~16자리(8바이트) 까지 표현할 수 있습니다. 따라서 float 의 정밀도보다 더 높은 정밀도가 필요하다면 double 을 사용해야 합니다
char gender1 = 'w';
String gender2 = "w";
String gender3 = "female";
String phone = "010-123-4567";
boolean isWoman = true; //true 또는 false
System.out.println("여성입니까?" + isWoman );
System.out.println("이름 : "+ name); // 이때에 +는 연결 연산자
System.out.println("나이 : "+ age); // 30
System.out.println("한국나이 : "+ (age+1)); // 한국나이 : 31
--------------------------------------------------------------------------------------------------------------------------------------------------
package ch06;
//이 클래스는 사람 관련 클래스다.
public class Human01 {
//field-데이터 저장
//[접근제한자][제어자] 타입 필드명[=값];
//나의 대한 데이터
// String name = "송준호"; //이름
// String country = "대한민국";//국적
// String gender = "남자"; //성별
// int age = 36; //나이
// double weight = 77.2; //몸무게
// double height = 173.2; //신장
// String job = "실업자"; //직업
// String Addr = "경기도 성남시 중원구 은행동 2228, 301호"; //주소
//강사님이 한 것
//손흥민 데이터
//필드를 선언할때 초기값 설정.
String name = "손흥민"; //이름
char gender = '남'; //성별
String job = "축구선수"; //직업
int age = 31; //나이
String nation = "대한민국";//국적
double height = 183.9; //신장
//method-기능
//[접근제한자][제어자] 리턴유형 메소드명(argument=매개변수){}
//public static void main(String[] args){}
//내가 한 것
// //본다.
// void watch() {
// System.out.println("watch()호출-본다. -> 무언가를 보고있다.");
// }
// //먹는다.
// void eat() {
// System.out.println("eat()호출-먹는다 -> 무언가를 먹고 있다.");
// }
// //잔다.
// void sleep() {
// System.out.println("sleep()호출-잔다. -> 자고있다.");
// }
// //말한다.
// void talk() {
// System.out.println("talk()호출-말한다. -> 말하고 있다.");
// }
// //걷다.
// void walk() {
// System.out.println("walk()호출-걷는다. -> 걷고 있다.");
// }
// //달리다.
// void run() {
// System.out.println("run()호출-뛴다. -> 걷고 있다.");
//강사님이 한 것.
//리턴유형 메소드명(매개변수) {}
//움직인다.
void move() {
System.out.println("move()호출-움직인다. -> 움직이고 있다.");
}
//말한다.
void speak() {
System.out.println("speak()호출-말한다. -> 말하고 있다.");
}
//먹는다.
void eat() {
System.out.println("eat()호출-먹는다 -> 무언가를 먹고 있다.");
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------
package ch06;
//Human01.java 에 있는 기능을 끌어다 쓰는 메인 실행 클래스이다.
//이 클래스는 실행클래스이다.
public class Human01_Main {
//field - 데이터 저장
//[접근제어자] [제어자] 타입 필드명[=값];
//method-기능
//[접근제어자] [제어자] 리턴유형 메소드(매개변수){}
public static void main(String[] args) {
//참조변수선언
//타입 참조변수명=초기값;
// Human01 myBody = null;
// System.out.println(myBody); 여기까지는 아직 스택영역에 주소가 저장 되지 않았다. 그냥 null
//객체생성
//new 생성자();
//참조변수명=
// myBody = new Human01(); 이걸 해야 주소값이 생기면서 연결된다.
//참조변수 선언 및 클래스 객체생성
Human01 myBody = new Human01();
System.out.println(myBody); //주소값 출력
//필드값 get: 문법> 참조변수.필드명
String name = myBody.name;
char gender = myBody.gender;
String job = myBody.job;
int age = myBody.age;
String nation = myBody.nation;
double height = myBody.height;
// System.out.println("이름 : "+myBody.name);
System.out.println("이름 : "+name); //위랑 같다. --> 참조변수 또 선언하여 간소화 한 것.
// System.out.println("성별 : "+myBody.gender);
System.out.println("성별 : "+gender); //위랑 같다.
// System.out.println("직업 : "+myBody.job);
System.out.println("직업 : "+job); //위랑 같다.
// System.out.println("나이 : "+myBody.age);
System.out.println("나이 : "+age); //위랑 같다.
// System.out.println("국적 : "+myBody.nation);
System.out.println("국적 : "+nation); //위랑 같다.
// System.out.println("신장 : "+myBody.height);
System.out.println("신장 : "+height); //위랑 같다.
//필드값 변경 문법 > 참조변수.필드명=값;
myBody.height = 184.9;
height = myBody.height;
System.out.println("변경 후, 신장 : "+height); //위랑 같다.
//System.out.println("변경 후, 신장 : "+myBody.height); //위랑 같다.
//메소드를 호출
//참조변수명.메소드명()
myBody.move();
myBody.speak();
myBody.eat();
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------
package ch06;
//이 클래스는 사람 관련 클래스다.
//Human02.java 에 있는 기능을 끌어다 쓰는 메인 실행 클래스이다.
//이 클래스는 실행클래스이다.
//*전역변수 타입에 따른 자동초기화(p199) 참고>배열(p156)에서도 다루었던 내용
//-초기값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정된다.
//필드의 타입에 따라 초기값이 다른데, 다음표는 필드 타입별 기본 초기값을 보여준다.
//-char : '\u0000' -> 공백으로 자동초기화가 된다는 뜻.
//-boolean : false
//-정수 : byte, short, int -> 0
// long -> 0L 리터럴 형변환(기본형이 int이기 때문에)
//-실수 : float -> 0.0F(기본형이 double이라서)
// double -> 0.0
//-클래스[] : null
//-배열[] : null
public class Human02 {
//field-데이터 저장
//[접근제한자][제어자] 타입 필드명[=값];
//이곳에 선언하는 변수는 전역변수 --> 아래 모두 전역변수 이것들은 초기값을 입력하지 않으면 자동으로 초기화가 된다.
//나의 대한 데이터
// String name = "송준호"; //이름
// String country = "대한민국";//국적
// String gender = "남자"; //성별
// int age = 36; //나이
// double weight = 77.2; //몸무게
// double height = 173.2; //신장
// String job = "실업자"; //직업
// String Addr = "경기도 성남시 중원구 은행동 2228, 301호"; //주소
// //강사님이 한 것
// //손흥민 데이터
// String name = "손흥민"; //이름
// char gender = '남'; //성별
// String job = "축구선수"; //직업
// int age = 31; //나이
// String nation = "대한민국";//국적
// double height = 183.9; //신장
String name; //이름
char gender; //성별
String job; //직업
int age; //나이
String nation;//국적
double height; //신장
//~~~~~~~~~~~~~~~~생성자코드(있지만 보이지 않는다)~~~~Human02(){} 이런식으로...~~~~~~~클래스명(){}~~~~
//위치는 이정도.
//method-기능
//[접근제한자][제어자] 리턴유형 메소드명(argument=매개변수){}
//public static void main(String[] args){}
//내가 한 것
// //본다.
// void watch() {
// System.out.println("watch()호출-본다. -> 무언가를 보고있다.");
// }
// //먹는다.
// void eat() {
// System.out.println("eat()호출-먹는다 -> 무언가를 먹고 있다.");
// }
// //잔다.
// void sleep() {
// System.out.println("sleep()호출-잔다. -> 자고있다.");
// }
// //말한다.
// void talk() {
// System.out.println("talk()호출-말한다. -> 말하고 있다.");
// }
// //걷다.
// void walk() {
// System.out.println("walk()호출-걷는다. -> 걷고 있다.");
// }
// //달리다.
// void run() {
// System.out.println("run()호출-뛴다. -> 걷고 있다.");
//강사님이 한 것.
//리턴유형 메소드명(매개변수) {}
//움직인다.
void move() {
System.out.println("move()호출-움직인다. -> 움직이고 있다.");
}
//말한다.
void speak() {
System.out.println("speak()호출-말한다. -> 말하고 있다.");
}
//먹는다.
void eat() {
System.out.println("eat()호출-먹는다 -> 무언가를 먹고 있다.");
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------
package ch06;
//Human02.java 에 있는 기능을 끌어다 쓰는 메인 실행 클래스이다.
//이 클래스는 실행클래스이다.
//*전역변수 타입에 따른 자동초기화(p199) 참고>배열(p156)에서도 다루었던 내용
//-초기값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정된다.
//필드의 타입에 따라 초기값이 다른데, 다음표는 필드 타입별 기본 초기값을 보여준다.
//-char : '\u0000' -> 공백으로 자동초기화가 된다는 뜻.
//-boolean : false
//-정수 : byte, short, int -> 0
// long -> 0L 리터럴 형변환(기본형이 int이기 때문에)
//-실수 : float -> 0.0F(기본형이 double이라서)
// double -> 0.0
//-클래스[] : null
//-배열[] : null
public class Human02_Main {
//field - 데이터 저장
//[접근제어자] [제어자] 타입 필드명[=값];
//method-기능
//[접근제어자] [제어자] 리턴유형 메소드(매개변수){}
public static void main(String[] args) {
//참조변수선언
//타입 참조변수명=초기값;
// Human01 myBody = null;
// System.out.println(myBody); 여기까지는 아직 스택영역에 주소가 저장 되지 않았다. 그냥 null
//객체생성
//new 생성자();
//참조변수명=
// myBody = new Human01(); 이걸 해야 주소값이 생기면서 연결된다.
//참조변수 선언 및 클래스 객체생성
Human02 myBody = new Human02();
System.out.println(myBody); //주소값 출력
//필드값 get: 문법> 참조변수.필드명
String name = myBody.name;
char gender = myBody.gender;
String job = myBody.job;
int age = myBody.age;
String nation = myBody.nation;
double height = myBody.height;
// System.out.println("이름 : "+myBody.name);
System.out.println("이름 : "+name); //위랑 같다. --> 참조변수 또 선언하여 간소화 한 것.
// System.out.println("성별 : "+myBody.gender);
System.out.println("성별 : "+gender); //위랑 같다.
// System.out.println("직업 : "+myBody.job);
System.out.println("직업 : "+job); //위랑 같다.
// System.out.println("나이 : "+myBody.age);
System.out.println("나이 : "+age); //위랑 같다.
// System.out.println("국적 : "+myBody.nation);
System.out.println("국적 : "+nation); //위랑 같다.
// System.out.println("신장 : "+myBody.height);
System.out.println("신장 : "+height); //위랑 같다.
//필드값 변경 문법 > 참조변수.필드명=값;
myBody.height = 184.9;
height = myBody.height;
System.out.println("변경 후, 신장 : "+height); //위랑 같다.
//System.out.println("변경 후, 신장 : "+myBody.height); // 바로 위에 2줄 생략 할 거면 이런식으로 출력해야한다.
//메소드를 호출
//참조변수명.메소드명()
myBody.move();
myBody.speak();
myBody.eat();
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------
package ch06;
//이 클래스는 사람 관련 클래스다.
/*생성자(constructor p203~)
-객체(object)를 생성
-new 연산자에 의해 호출되어 객체의 초기화 담당
-문법> 생성자명()
-생성자 선언
생성자 문법> [접근제한자] 클래스명(매개변수리스트){} // 클래스명과 똑같이 하기로 약속 --> 클래스명(){} ---> 생성자에서는 제어자와 리턴유형 따위 존재하지 않는다.
참고.비교!! 메소드 문법>
[접근제한자][제어자] 리턴유형 메소드명(매개변수리스트){}
[접근제한자][제어자] 리턴유형 메소드명(){}
-생성자(constructor)
- 매개변수가 없는 생성자 : 기본생성자(default constructor). 객체생성 --->이것이 기본형
==> 생성자 호출 문법> new 클래스명((; - 매개변수가 있는 생성자 : 객체생성시 클래스 필드값을 초기화
==> 생성자 호출 문법> 클래스명(매개변수리스트); - /
/*
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//오버로딩이란(Overloading)? (p208 생성자 오버로딩) (p232 메소드 오버로딩)- 하나의 동일 클래스 내에서 이름은 동일하지만 매개변수의 개수, 타입, 순서가 다른 메소드를 말한다.
- 하나의 동일 클래스 내에서 동일한 메소드(생성자)가 존재하면 안된다.
- 단, 매개변수의 개수, 타입, 순서가 다르면 가능하다
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ - /
public class Human03 {
//field-데이터 저장
//[접근제한자][제어자] 타입 필드명[=값];
//이곳에 선언하는 변수는 전역변수 --> 아래 모두 전역변수 이것들은 초기값을 입력하지 않으면 자동으로 초기화가 된다. - //나의 대한 데이터
// String name = "송준호"; //이름
// String country = "대한민국";//국적
// String gender = "남자"; //성별
// int age = 36; //나이
// double weight = 77.2; //몸무게
// double height = 173.2; //신장
// String job = "실업자"; //직업
// String Addr = "경기도 성남시 중원구 은행동 2228, 301호"; //주소
// //강사님이 한 것
// //손흥민 데이터
// String name = "손흥민"; //이름
// char gender = '남'; //성별
// String job = "축구선수"; //직업
// int age = 31; //나이
// String nation = "대한민국";//국적
// double height = 183.9; //신장
String name; //이름
char gender; //성별
String job; //직업
int age; //나이
String nation;//국적
double height; //신장
//생성자--> 생성자도 메소드에 속한다.
//[접근제한자] 클래스명(매개변수){} //접근제한자는 보통 public으로
//기본 생성자(default constructor)
Human03 (){
System.out.println("Human03()호출성공-기본생성자");
} //디폴트 컨스트럭트는 입력값이 없지만 계속 작동하고 있다.
//객체생성시 외부에서 제공된 값을
//String n 변수에 저장
Human03(String n){ //-->여기 변수는 지역변수=로컬변수
// Human03(String n, char a, String b, int c, String d, double e){ //-->여기 변수는 지역변수=로컬변수
System.out.println("String 1개인 생성자 호출 성공/n="+n);
//생성자의 매개값으로 초기값 설정(p206~)
//필드값 변경 문법 > 참조변수.필드명=값;
//name이라는 이름의 필드값을 매개변수 n에 저장된 값으로 변경
this.name=n; //--->객체가 만들어졌을 그 당시의 변수..n 즉 참조변수를 뜻한다.
//즉 this는 자기자신을 가리키는 참조변수이다. 외부에서 자신을 바라보는것이 아닌 자기자신을 가리킨다는 뜻
// this.gender=a;
// this.job=b;
// this.age=c;
// this.nation=d;
// this.height=e;
//
}
//외부에서 매개변수가 있는 생성자 호출하면 전달받은 값을
//매개변수에 저장
Human03(char a){ //-->여기 변수는 지역변수=로컬변수
System.out.println("char 1개인 생성자 호출 성공/n="+a);
this.gender=a; //--->객체가 만들어졌을 그 당시의 변수..n 즉 참조변수를 뜻한다.
}
//int형 1개의 매개변수를 가진 생성자 선언
//매개변수에 저장된 값을 age필드에 설정
Human03(int b){ //-->여기 변수는 지역변수=로컬변수
System.out.println("int 1개인 생성자 호출 성공/n="+b);
this.age=b; //--->객체가 만들어졌을 그 당시의 변수..n 즉 참조변수를 뜻한다.
}
//double형 1개의 매개변수를 가진 생성자 선언
//매개변수에 저장된 값을 Height필드에 설정
Human03(double c){ //-->여기 변수는 지역변수=로컬변수
System.out.println("double 1개인 생성자 호출 성공/n="+c);
this.height=c; //--->객체가 만들어졌을 그 당시의 변수..n 즉 참조변수를 뜻한다.
}
//매개변수 2개인 생성자
//이름과 성별을 객체생성시 설정할 수 있는 생성자
Human03(String y, char z){ //-->여기 변수는 지역변수=로컬변수
System.out.println("String 1개와 char 1개인 생성자 호출 성공/n="+y+", "+z);
this.name=y;
this.gender=z;
}
// Human03(char z, String y){ //-->여기 변수는 지역변수=로컬변수
// System.out.println("String 1개와 char 1개인 생성자 호출 성공/n="+y+", "+z);
//
// this.name=y;
// this.gender=z;
//
// }
//6개의 필드를 객체생성시 외부에서 제공받아 설정
// Human03(String n, char a, String b, int c, String d, double e){ //-->여기 변수는 지역변수=로컬변수
//
// this.name=n;
// this.gender=a;
// this.job=b;
// this.age=c;
// this.nation=d;
// this.height=e;
//
// }
//6개의 필드를 객체생성시 외부에서 제공받아 설정(변수 동일하게 한 경우, 무조건 this로 구분 해야한다.)
//참조변수 this는 필드명이 매개변수와 동일하면 반드시 필드명 앞에 this를 써야한다.
//예시> this.필드명 = 매개변수;
Human03(String name, char gender, String job, int age, String nation, double height){
this.name=name;
this.gender=gender;
this.job=job;
this.age=age;
this.nation=nation;
this.height=height;
}
//위와 같이 휴먼 생성자 또는 메소드를 여러번 부르는것을
//메소드 오버로딩 또는
//생성자 오버로딩 이라고 한다.
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//this란 자기자신을 가리키는 참조변수... 가장 간결한 대답
//만약 입력받는 int b가 int age로 this.age와 이름이 같을때는 무조건 this를 붙여줘야 한다.
//반대로 전역변수(필드)와 매개변수가 다르면 this를 안써도 구분이 가능하여 에러나지 않는다.
//그리고 메소드나 생성자들도 이름이 같은것을 만들면 안되는것이 원칙이지만 이름이 같아도 매개변수가 있고 없고로 허용이 되고 만약 똑같이 매개변수까지 똑같이 받으면 입력받는 매개변수 타입을 다르게 하면 허용된다.
//만
~
약에 개수 똑같고 타입도 똑같다 싶으면... 변수 순서가 바꿔도 된다! 이런 것들이 위에서 명시한 것 과 같이 메소드 오버로딩, 컨스트럭트(생성자) 오버로딩 라고 한다.
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//method-기능
//[접근제한자][제어자] 리턴유형 메소드명(argument=매개변수){}
//public static void main(String[] args){}
//내가 한 것
// //본다.
// void watch() {
// System.out.println("watch()호출-본다. -> 무언가를 보고있다.");
// }
// //먹는다.
// void eat() {
// System.out.println("eat()호출-먹는다 -> 무언가를 먹고 있다.");
// }
// //잔다.
// void sleep() {
// System.out.println("sleep()호출-잔다. -> 자고있다.");
// }
// //말한다.
// void talk() {
// System.out.println("talk()호출-말한다. -> 말하고 있다.");
// }
// //걷다.
// void walk() {
// System.out.println("walk()호출-걷는다. -> 걷고 있다.");
// }
// //달리다.
// void run() {
// System.out.println("run()호출-뛴다. -> 걷고 있다.");
//강사님이 한 것.
//리턴유형 메소드명(매개변수) {}
//움직인다.
void move() {
System.out.println("move()호출-움직인다. -> 움직이고 있다.");
}
//말한다.
void speak() {
System.out.println("speak()호출-말한다. -> 말하고 있다.");
}
//먹는다.
void eat() {
System.out.println("eat()호출-먹는다 -> 무언가를 먹고 있다.");
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------
package ch06;
//이클래스는 Human03클래스의 실행클래스이다.
//생성자와 관련된 내용을 연습하는 파일
//*전역변수 타입에 따른 자동초기화(p199) 참고>배열(p156)에서도 다루었던 내용
//-초기값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정된다.
//필드의 타입에 따라 초기값이 다른데, 다음표는 필드 타입별 기본 초기값을 보여준다.
public class Human03_Main {
//field - 데이터 저장
//[접근제어자] [제어자] 타입 필드명[=값];
//생성자(constructor)
//[접근제한자] 클래스명(매개변수){} //접근제한자는 보통 public으로
//기본 생성자(default constructor)
//method
//[접근제어자] [제어자] 리턴유형 메소드(매개변수){}
//필드값을 출력하는, 보여주는 기능 -->출력하기 Human03클래스 타입
//Human03 h에는 Human03클래스의 객체주소가 저장된다. (p235)
static void printField(Human03 h) { //동일 클래스 내에 메소드를 호출 할 수 있는데 그중에 static이 붙은것 끼리 호출할 수 있다. ---> 메소드를 만든 것.
//생성자 객체 선언 할때 타입이 Human03 이었기 때문에 그것으로 선언한다. 다시 말해 Human03도 클래스의 한 형태 이다.
//필드값 get: 문법> 참조변수.필드명 --->덮어 씌울거라서 앞에 타입을 지운다.
String name = h.name; System.out.println("이름 : "+name); //Mr.son
char gender = h.gender; System.out.println("성별 : "+gender); //남
String job = h.job; System.out.println("직업 : "+job); //축구선수
int age = h.age; System.out.println("나이 : "+age); //31
String nation = h.nation; System.out.println("국적 : "+nation); //대한민국
double height = h.height; System.out.println("신장 : "+height); //183.3
System.out.println();
System.out.println();
}
public static void main(String[] args) {
//참조변수선언
//타입 참조변수명=초기값;
// Human01 h1 = null;
// System.out.println(myBody); 여기까지는 아직 스택영역에 주소가 저장 되지 않았다. 그냥 null
//객체생성
//new 생성자();
//참조변수명=
// h1 = new Human01(); 이걸 해야 주소값이 생기면서 연결된다.
//참조변수 선언 및 클래스 객체생성 -> 클래스 타입 참조변수명 = new 클래스명();
//new Human03()는 Human03클래스의 기본생성자 호출
Human03 h1 = new Human03(); ///Human03 생성자 의 프린트 문이 출력된다. "Human03()호출성공-기본생성자"
System.out.println("기본 생성자 이용 : object생성");
System.out.println("h1 참조변수 = "+h1); //주소값 출력
System.out.println("h1 참조변수 = "+h1.toString()); //주소값 출력
System.out.println("---필드값---"); //Human03 필드에 세팅되어있는 값이 나타나지만 꼭 값을 넣지 않아도 초기값이 자동으로 나타난다.
//printField(~~)를 호출하기 위해서는
//Human03클래스의 객체주소를 제시 -->객체 주소는 h1, h2 이런것
printField(h1);
//필드값 get: 문법> 참조변수.필드명
// String name = h1.name; System.out.println("이름 : "+name);
// char gender = h1.gender; System.out.println("성별 : "+gender);
// String job = h1.job; System.out.println("직업 : "+job);
// int age = h1.age; System.out.println("나이 : "+age);
// String nation = h1.nation; System.out.println("국적 : "+nation);
// double height = h1.height; System.out.println("신장 : "+height);
// System.out.println();
// System.out.println();
//매개변수가 있는 생성자를 이용하여 객체생성
//타입(클래스명) 참조변수 = new 클래스명(매개변수1, 매개변수2); -->매개 변수를 가지고 있는 생성자는 무조건 생성해주어야 한다.Human03에
// Human03 h2 = new Human03("Mr.son", '남', "축구선수", 31, "대한민국", 183.3); //The constructor Human03(String) is undefined --> 해당 생성자는 정의되지 않았다~
Human03 h2 = new Human03("Mr.son"); //The constructor Human03(String) is undefined --> 해당 생성자는 정의되지 않았다~
//Human03 의 매개변수 생성자 Human03(String n)으로 호출 당하면서 "Mr.son"이라는 문자열을 가지고 가서 입력값을 준다.
System.out.println("매개변수 생성자 이용 : object생성");
System.out.println("h2 참조변수 = "+h2); //주소값 출력
System.out.println("h2 참조변수 = "+h2.toString()); //주소값 출력
//Human03클래스의 객체주소를 제시 -->객체 주소는 h1, h2 이런것
printField(h2);
// System.out.println("---필드값---"); //Human03 필드에 세팅되어있는 값이 나타나지만 꼭 값을 넣지 않아도 초기값이 자동으로 나타난다.
// //필드값 get: 문법> 참조변수.필드명 --->덮어 씌울거라서 앞에 타입을 지운다.
// name = h2.name; System.out.println("이름 : "+name); //Mr.son
// gender = h2.gender; System.out.println("성별 : "+gender);//공백
// job = h2.job; System.out.println("직업 : "+job); //null
// age = h2.age; System.out.println("나이 : "+age); //0
// nation = h2.nation; System.out.println("국적 : "+nation); //null
// height = h2.height; System.out.println("신장 : "+height); //0.0
// System.out.println();
// System.out.println();
//아래 Human02_Main 에 있는 방법도 가능하지만 이 방법은 메인에서 설계도 쪽 필드값으로 직접 접촉하는 방법. 즉 외부에서 접근하는 방법으로.. 보안상 적절치 않다. 그래서 위와 같이 매개변수를 주고 설계도 쪽에 this.을 써서 변경하는 방법을 쓰는게 적절하다.
// //필드값 변경 문법 > 참조변수.필드명=값;
// myBody.height = 184.9;
// height = myBody.height;
// System.out.println("변경 후, 신장 : "+height); //위랑 같다.
// //System.out.println("변경 후, 신장 : "+myBody.height); // 바로 위에 2줄 생략 할 거면 이런식으로 출력해야한다.
System.out.println("-char 1개인 생성자 이용");
//매개변수가 있는 생성자를 이용하여 객체생성-----------------------------
//성별이 '남'인 Human03객체 생성
Human03 h3 = new Human03('남');
System.out.println("매개변수 생성자 이용 : object생성");
System.out.println("h3 참조변수 = "+h3); //주소값 출력
System.out.println("h3 참조변수 = "+h3.toString()); //주소값 출력
//Human03클래스의 객체주소를 제시 -->객체 주소는 h1, h2 이런것
printField(h3);
// System.out.println("---필드값---"); // h2랑 관계가 없는 참조변수 h3이므로 성별 빼고는 모두 다시 초기값으로 출력된다.
// name = h3.name; System.out.println("이름 : "+name); // null
// gender = h3.gender; System.out.println("성별 : "+gender); // 남
// job = h3.job; System.out.println("직업 : "+job); // null
// age = h3.age; System.out.println("나이 : "+age); //0
// nation = h3.nation; System.out.println("국적 : "+nation); //null
// height = h3.height; System.out.println("신장 : "+height); //0.0
// System.out.println();
// System.out.println();
System.out.println("-int 1개인 생성자 이용");
//매개변수가 있는 생성자를 이용하여 객체생성-----------------------------
//나이가 20인 Human03객체 생성
Human03 h4 = new Human03(20);
System.out.println("매개변수 생성자 이용 : object생성");
System.out.println("h4 참조변수 = "+h4); //주소값 출력
System.out.println("h4 참조변수 = "+h4.toString()); //주소값 출력
//Human03클래스의 객체주소를 제시 -->객체 주소는 h1, h2 이런것
printField(h4);
// System.out.println("---필드값---"); // h3랑 관계가 없는 참조변수 h4이므로 성별 빼고는 모두 다시 초기값으로 출력된다.
// name = h4.name; System.out.println("이름 : "+name); // null
// gender = h4.gender; System.out.println("성별 : "+gender); // 공백
// job = h4.job; System.out.println("직업 : "+job); // null
// age = h4.age; System.out.println("나이 : "+age); //20
// nation = h4.nation; System.out.println("국적 : "+nation); //null
// height = h4.height; System.out.println("신장 : "+height); //0.0
// System.out.println();
// System.out.println();
System.out.println("-double 1개인 생성자 이용");
//매개변수가 있는 생성자를 이용하여 객체생성-----------------------------
//신장이 183.7인 Human03객체 생성
Human03 h5 = new Human03(183.7); //-->주의할 점이 기존에 생성자 중에 int 타입으로 입력받는 생성자가 있어서 키를 실수타입이 아닌 정수타입으로 던지면 int타입 입력을 받는 나이 생성자쪽으로 입력을 받게된다.
System.out.println("매개변수 생성자 이용 : object생성");
System.out.println("h5 참조변수 = "+h5); //주소값 출력
System.out.println("h5 참조변수 = "+h5.toString()); //주소값 출력
//Human03클래스의 객체주소를 제시 -->객체 주소는 h1, h2 이런것
printField(h5);
// System.out.println("---필드값---"); // h4랑 관계가 없는 참조변수 h5이므로 성별 빼고는 모두 다시 초기값으로 출력된다.
// name = h5.name; System.out.println("이름 : "+name); // null
// gender = h5.gender; System.out.println("성별 : "+gender); // 공백
// job = h5.job; System.out.println("직업 : "+job); // null
// age = h5.age; System.out.println("나이 : "+age); // 0
// nation = h5.nation; System.out.println("국적 : "+nation); //null
// height = h5.height; System.out.println("신장 : "+height); //183.7
// System.out.println();
// System.out.println();
System.out.println("-String 1개, char 1개인 생성자 이용");
//매개변수가 있는 생성자를 이용하여 객체생성-----------------------------
//이름 Mr.son, 성별 남 인 Human03객체 생성
Human03 h6 = new Human03("Mr.son", '남'); //-->주의할 점이 기존에 생성자 중에 int 타입으로 입력받는 생성자가 있어서 키를 실수타입이 아닌 정수타입으로 던지면 int타입 입력을 받는 나이 생성자쪽으로 입력을 받게된다.
System.out.println("매개변수 생성자 이용 : object생성");
System.out.println("h6 참조변수 = "+h6); //주소값 출력
System.out.println("h6 참조변수 = "+h6.toString()); //주소값 출력
//Human03클래스의 객체주소를 제시 -->객체 주소는 h1, h2 이런것
printField(h6);
// System.out.println("---필드값---"); // h5랑 관계가 없는 참조변수 h6이므로 성별 빼고는 모두 다시 초기값으로 출력된다.
// name = h6.name; System.out.println("이름 : "+name); // Mr.son
// gender = h6.gender; System.out.println("성별 : "+gender); // 남
// job = h6.job; System.out.println("직업 : "+job); // null
// age = h6.age; System.out.println("나이 : "+age); // 0
// nation = h6.nation; System.out.println("국적 : "+nation); // null
// height = h6.height; System.out.println("신장 : "+height); // 0.0
// System.out.println();
// System.out.println();
// Human03 h7 = new Human03('남', "Mr.son");
//객체 생성시 값을 부여하여 객체
Human03 h7 = new Human03("Mr.son", '남', "축구선수", 31, "대한민국", 183.3);
System.out.println("매개변수 생성자 이용 : object생성");
System.out.println("h7 참조변수 = "+h7); //주소값 출력
System.out.println("h7 참조변수 = "+h7.toString()); //주소값 출력
//Human03클래스의 객체주소를 제시 -->객체 주소는 h1, h2 이런것
printField(h7);
// System.out.println("---필드값---");
// //필드값 get: 문법> 참조변수.필드명 --->덮어 씌울거라서 앞에 타입을 지운다.
// name = h7.name; System.out.println("이름 : "+name); //Mr.son
// gender = h7.gender; System.out.println("성별 : "+gender); //남
// job = h7.job; System.out.println("직업 : "+job); //축구선수
// age = h7.age; System.out.println("나이 : "+age); //31
// nation = h7.nation; System.out.println("국적 : "+nation); //대한민국
// height = h7.height; System.out.println("신장 : "+height); //183.3
// System.out.println();
// System.out.println();
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------