본문 바로가기
개발자로 가는 길(국비지원과정)/1. Java

[자바복습 Day06] 자바의 특징, OOP, 캡슐화, 추상화, 생성자의 존재 이유, String의 기본값(null), 향상된 for문, package, is-a관계, has-a관계, 연산자 instanceof, 다형성

by 레아Leah 2022. 1. 4.
반응형

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

 

<다형성>

: 아버지의 레퍼런스가 자식 객체를 가리키는 것 

 

반응형