OOP언어의 특징
1) 캡슐화
2) 상속
: 기존에 존재하는 클래스(상위, 부모 클래스, super class<->하위, 자식, 파생, sub class)를 확장해서 사용하는 개념
: extends라는 키워드로 public, protected한 요소들을 상속받아 확장한다.
: private, 생성자는 상속되지 않는다.
: 메소드(기능)를 상속하기 위해 상속이 사용되어 진다.
: (부모)생성자는 상속되지 않기 때문에 super();를 사용한다.
: super();는 부모의 기본생성자를 호출함!
<오버라이딩>
상속받은 public한 메소드 기능을 확장할 수 있다. ==> overriding
상속받은 메소드가 마음에 들지 않을 경우 리폼해서 사용하는 것이 오버라이드라고 한다. (재정의)
오버라이딩의 규칙
-메소드 시그니쳐가 같아야 한다. 중괄호()를 뺀 앞쪽
-접근지정자(private < protected < default < public)는 부모보다는 크거나 같아야 한다.
class MyCircle extends MyPolygon{
private int radius;
@Override //(생략가능, JVM에게 확인해달라고 말하는 것임!)
public void output() {
}
}
@Override 부모에서 상속받은 메소드를 고쳐쓰겠다는 표시
메소드시그니쳐가 같아야 하지만 유일하게 접근지정자만 부모클래스보다 크다면 수정할 수 있다.
자바는 객체지향(Object Oriented Programming)을 가장 많이 따르는 언어이다.
-명사적 요소 : 멤버변수(국어점수)
-동사적 요소 : 메소드(기능->연산적인 요소, 비즈니스 로직)
추상화
: 필요한 정보를 수집하는 행위
: 개발을 위해 어떤 데이터가 필요한지 제일 먼저 확인한다.
객체들을 메모리에 올리는 작업
: new 생성자(); -> 메모리에 올라감
접근을 하기 위해 참조변수가 필요하다.
: new 생성자();로 만들어지면 heap영역에 만들어지면 GC가 감시한다. GC는 heap영역에 있는 것만 삭제한다.
현재 실행중이거나, stack영역에서 해당 영역을 참조하고 있으면 삭제할 수 없다.
: class명 t = new 생성자():
: t = new 생성자(): 되면 GC가 이전에 만든 객체를 삭제한다.
GC
: 메모리 정리를 위해 사용됨.
: 작동하는 것이 가장 낮은 하위 우선순위
: CPU가 바쁘면 메모리 회수를 못함.
<생성자 함수의 특징>
class Student{
//멤버변수
//생성자
Student(){
}
//setter, getter
}
1. 이름은 클래스명과 동일하다.
2. 무저간 한 개 이상 있어야 한다. --> 개발자가 안만들면 JVM이 만든다.
3. 오버로딩이 가능하다. : 이름이 같고, 전달인자의 개수나 타입이 다름
4. 생성자의 존재 이유 : 힙 영역에 데이터를 올리기 위해, 객체를 메모리에 올리기 위해, 로딩, 멤버변수 초기화
★참조 자료형 String의 기본값? null★
null => 나는 참조하는 것이 없다는 뜻!
//Teacher객체를 전부 메모리에 올리면서 초기화시킨다!
Teacher t = new Teacher();
//t의 주소, hash주소
System.out.println(t);
출력값 : Teacher@626b2d4a
==> 객체가 같으면 hash주소가 같다.
//아직 가리키는 객체가 없어
Teacher t2 = null;
System.out.println(t2.getId());
==> 참조하는 것이 없는데 가리키고 있기때문에, 초기화하지 않은 객체를 가리키고 있기 때문에 null을 가리켰다고 오류가 뜸(java.lang.NullPointerException:)! 이럴때는 객체를 생성하지 않았다고 생각하면 됨 !
//곧 GC가 작동
t = null;
//기존에 있던 Teacher t = new Teacher();에서 new Teacher();가 GC가 작동되어 삭제된다.
//t2가 가지고 있는 참조주소를 t로 복사
t = t2;
객체를 출력할 경우 toString()이 생략되어있는 상태이다.
System.out.println(t);
System.out.println(t.toString()); 상속받은 메소드!
toString()로 주소 확인할 경우 오버라이드하지 않고, 값을 출력할 경우에는 오버라이드한다.
출력
Teacher@626b2d4a
Teacher@626b2d4a
메소드는 내가 만든 것도 있지만 아버지로부터(Object) 상속받는 object 메소드도 있다.
Product t = new Product(); //객체
Product[] p = new Product[5]; //배열을 생성
p[0].getName();
메소드
public void output() {
System.out.println(code + " : " + name + ", " + price + "원");
}
이렇게 출력!
p[0].output();
출력값
1 : 볼펜, 1000원
//일반 for문
for(int i =0; i < p.length; ++i) {
p[i].output();
}
<향상된 for문>
//for each문
for(Product tmp : p)
tmp.output();
for(객체의 타입 변수 : 객체)
====하나의 파일 안에 여러 개의 클래스를 넣어봅시다.
1) main을 가진 클래스만 public 키워드를 가질 수 있다.
2) main을 가진 클래스가 파일명이 된다.
생성자가 없는 클래스는 없다!
super.는 무조건 상속받은 클래스 아버지, 부모생성자를 의미한다.
자바의 폴더: package
//*로 해주면 해당 패키지 안 모든 것을 말한다.
import com.tomo.inherit.*;
System.out.println(bread);
System.out.println(bread.toString());
출력된 주소값
com.tomo.inherit.Bread@1c4af82c
com.tomo.inherit.Bread@1c4af82c
VO를 만들 때 멤버변수, 생성자, 오버로딩한 생성자, SETTER, GETTER, TOSTRING!이 필요하다.
super와 this는 같이 있을 수 없다.
두 가지 모두 상단에 있어야 하기 때문이다.
아래의 this는 오버로딩된 생성자로 감!
public Roll() {
this(34);
}
public Roll(int length) {
super();
this.length = length;
}
<상속관계>
is-a관계 동등한 관계
has-a관계 포함된 관계 (다른 클래스를 가지고 있는 경우)
//클래스가 멤버변수로 가지고 있는 관계를 has-a관계라고 한다.
public class Bakery {
private Bread bread;
private Cake cake;
private Roll roll;
}
연산자 instanceof
: (is-a 관계인지 확인할 때 사용 true or false가 return된다.)
: 주로 상속관계임을 확인할 때 사용
참조변수 instanceof 타입(부모, 상위클래스명)
System.out.println(bread instanceof Bread);
출력값
true
<다형성>
: 아버지의 레퍼런스가 자식 객체를 가리키는 것