1. 변수(Variable)
(1) 유효범위
(2) 소유( static 여부)
(3) 변경( final 여부 )
(4) 메모리 저장방식
2) 참조형(레퍼런스)
<1> call by reference
<2> 형태: 대문자로 시작
<3> 종류: 기본형(8가지)를 제외한 모든 타입( 무한대 )
<4> 초기값: null
<5> 형변환
Object
▲
Human
▲
Superman
cf) 배열변수
-> 배열을 저장하는 변수
2. OOP ( Object Oriented Programming ) 특성
(1) 상속성( Inheritance )
부모의 '모든 것'을 자식에서 '상속받는 것' (=='사용할 수 있는 것')
- 다른 생성자가 하나도 없을 경우에만 JVM이 기본생성자(default constructor)를 만들어준다.
- 자식 객체가 생성되려면 먼저 부모객체가 생성되어야 함
- 모든 생성자의 첫라인에는 super();가 생략되어 있음 (단, 다른 super(..)가 있다면 예외)
- 모든 객체는 Object의 자식이다. (묵시적 상속)
ex) class A extends Object
- 자식 메소드에서 부모 메소드의 내용을 바꿀 수 있음, =오버라이딩(Overriding)
* 세상의 어떤 객체라도 Object로 형변환이 가능하다, 왜냐하면 Object는 모든 것이기 때문이다.
- 형변환은 상속관계에서만 가능
-> 자동
-> 강제
(2) 다형성( Polymorphism )
같은 타입 객체의 '동일한 메소드가 다른 일을 하는 것(=특성)'
* 오버라이딩을 함으로써 객체의 다형성을 얻을 수 있다.
(3) (속성값의)은닉성( Information Hiding )
속성값(데이터)을 외부 객체로부터 '숨기는 것'
* 접근제한을 둬야 하는 정보에, private을 속성해주면 정보를 숨길 수 있다.
(4) (메소드의)캡슐화( Encapsulelation )
- 속성(데이터)과 메서드를 하나로 묶어 외부에 감추기도 하고 보이게도 하는 것
- 메소드의 형태(리턴타입, 이름, 파라미터)만 알면 그 내용을 몰라도 호출해서 사용할 수 있는 것
* 내용은 모르면서 이 메소드의 생성자나 형태만 알면 사용할 수 있는 것을 캡슐화라고 한다. ex) 콘택600
class Human {
String name = "홍길동";
//Human(){} //default생성자
Human(String name){
this.name = name;
}
void move(){
System.out.println("걷는다");
}
}
class Superman extends Human {
int power = 100;
Superman(){
super("클락1"); //new Human(String name)
}
Superman(String name, int power){
super(name); //new Human(String name)
this.power = power;
}
void shotLaserBeam(){
System.out.println("광선을 쏜다");
}
}
class Manager {
public static void main(String args[]){
/*Human h = new Human("이순신");
System.out.println("h.name: " + h.name);
h.move();
System.out.println();*/
Superman sm = new Superman("클락2", 200);
System.out.println("sm.name: " + sm.name);
sm.move();
System.out.println("sm.power: " + sm.power);
sm.shotLaserBeam();
}
}
무조건 동사형태
로 사용할 것class Man {
int age;
int height;
int weight;
/*
Man(){} // 1) 기본생성자일 때
void setAge(int age){
this.age = age;
}
void setHeight(int height){
this.height = height;
}
void setWeight(int weight){
this.weight = weight;
} // 1) 기본생성자일 때
// 파라미터 변수를 사용하게 되면 현재는 업무로직상 필요 없는 것처럼 보이나 해당 내용을 미리 만들어두면,
// 나중에 값을 변경하고 싶을 때 사용하므로 미리 만들어두는 편이 좋다.
*/
int getAge(){
return age;
}
int getHeight(){
return height;
}
int getWeight(){
return weight;
}
Man(int age, int height, int weight){
this.age = age;
this.height = height;
this.weight = weight;
}
}
class ManMgr{
public static void main(String[] args){
/*
Man m = new Man();
m.setAge(20);
m.setHeight(185);
m.setWeight(85); // 1) 기본생성자일 때
*/
Man m = new Man(22, 188, 75); // 2) 파라미터 변수를 가져올 때
System.out.println("age: " + m.getAge()); // 2) 파라미터 변수를 가져올 때
System.out.println("height: " + m.getHeight()); // 2) 파라미터 변수를 가져올 때
System.out.println("weight: " + m.getWeight()); // 2) 파라미터 변수를 가져올 때
}
}
Exception in thread "main" java.lang.ClassCastException
쓰레드 "main"java.lang.ClassCastException의 예외
멤버변수 0개, 생성자 1개, 메소드 11개
가 기본으로 있다. 객체의 근본적인 개념에서는 멤버변수, 생성자, 메소드가 아예 없는 게 맞는건데, 우리의 객체는 디바이스에 묶이기 때문에 이 정도를 기본으로 가지고 있는 것이다. class b extends object
wrapper class의 메소드나 멤버 변수를 사용하기 위해서
이다. 컬렉션에 저장하려고 하는 이유도 크다. 컬렉션에는 기본형을 저장할 수 없고, 오브젝트는 사칙연산이 안되기 때문에, 꼭 박싱을 해서 바꿔줘야 한다. => 이 부분 더 깊은 이해 필요함