본문 바로가기
JAVA SE/이론 및 개념

[20.07.23/Day_11] Java SE / Static, Final, Abstract 추상클래스, 추상메서드

by 파프리카_ 2020. 7. 23.
728x90
반응형

[ Review ]

 

기능 (method 메서드)

 

1) void를 넣는 경우 : 반환값이 없는 경우

 public void setName(String name){
 
	this.name = name;
    
 }

* void : 리턴값을 없음을 알림 - 반환하는 값이 없음

 

 

2) 데이터타입을 넣는 경우 : 반환값이 있는 경우

public String getName(){

	return name;

}

* string : 리턴 값의 타입

 

 


[ Static ]

: 별도의 객체 생성 없이 heap 메모리에 로드(적재)

* 프로그램 시작 첫 시점에 클래스 로딩이 되고, 이 때 static 정보가 적재된다.

 

>  static member(변수, 메서드)를 class의 member라고 한다. (instance의 영역이 아니다!)

 참고)
      Object member는 "instance variable" 과 "non-static method"이다. 

      Class member는 "static method"와 "Class의 package, method"이다. - Heap 메모리 영역에 적재

 

      
>  static은 붕어빵틀에 관련이 있다
   class(붕어빵틀)   |   Object(붕어빵) 

* Object는 동적 dynamic하게 저장된다.

 

ex) Person.eat(); 클래스명, 메서드명

        eat(); → static method이다.

 

 

java 실행 원리(순서)

 

 

예제)

public class TestStatic1 {
	int money = 100;
	public void test() {}
	public static void main(String[] args) {
		//System.out.println(money); 
		//test();
		// ** complie error
	}
}


위 코드는 compile error가 발생한다
→ why? static 메서드 내부이므로,  non-static(Object의 member)에게 직접 접근할 수 없도록  문법적으로 지정되어 있다.

즉, static에서 non-static으로 직접 접근할 수 없다.

 

 

public class TestStatic1 {
	static int sMoney = 100;
	public static void stest() {}
	public static void main(String[] args) {
		System.out.println(sMoney);
		stest();
	}
}

위 코드와 같이 같은 static으로 맞춰주어야 실행이 된다.

 

 

> 실행 class에서 main method보다 static이 먼저 실행된다.

: static 초기화 영역은 가장 먼저 실행된다. ← 주로 프로그램 사전 작업을 위해 쓰인다.

 

static 초기화 블럭 테스트 예제 )

public class TestStatic5 {
	public static void main(String[] args) {
		System.out.println("main 메서드 실행");
		DbDriver d = new DbDriver();
		d.test1();
		DbDriver d2 = new DbDriver();
		d2.test1();
	}
	static {
		System.out.println("static 초기화 영역 실행");
	}
	/* 출력값 : 
	 * static 초기화 영역 실행
	 * main 메서드 실행
	 * db 연동 초기화작업
	 * DbDriver class의 함수 실행
	 * DbDriver class의 함수 실행
	 */
}

class DbDriver{
	static {
		System.out.println("db 연동 초기화작업");
	}
	public void test1() {
		System.out.println("DbDriver class의 함수 실행");
	}
}

 


[ final 제어자 ]

 

변수 앞에 붙을 경우 → 재할당 불가 ex) final int PRICE=1; 이후 재할당 불가

메서드 앞에 붙은 경우 → 자식 클래스에서 메서드 오버라이딩 불가

클래스 앞에 붙을 경우 → 상속 불가 

 

class Theatre{
	//final 제어자를 명시하면, 재할당 불가
	// 자바에서 상수는 대문자로 표현한다
	final int MAX_PRICE = 100;
	final String MILK = "cute";
	
	public void test1() {
		//MAX_PRICE = 200; //final이므로 재할당 불가
		//milk = "so cute";
	}

	final public void sales() {
	}
}

//final 제어자를 클래스 앞에 명시하면, 상속불가
final class Movie{}

//class Summer extends Movie{}
//error : final이 붙은 클래스이기 때문에, 상속 불가

class Friends extends Theatre{
	// final이 붙은 함수이기때문에, 오버라이딩 불가
	//public void sales() {}
}


public class TestFinal {
	
}

 

* came case 자바 네이밍 룰

package 명 : 소문자 | package step1.exam;

class 명 : 대문자로 시작하고 합성어의 첫글자는 대문자, 나머지는 소문자 | BankService

variable / method 명 : 소문자로 시작하고, 합성어 첫글자는 대문자 | studentName, findPersonByTel

상수명 : 대문자로 구성하고, 합성어 앞에 _ 로 구성 | MEMBER_PASS, PRICE

 


[ Abstract  추상 클래스 / 메서드 ]

 

1) abstract class

: 속성과 기능을 가진부모의 역할만 하는 class → 자식들이 상속받아 사용하면, 빠르게 좋은 기능을 구현할 수 있다.

즉, 자식 클래스(sub class)에게 유용한 멤버(속성과 기능)을 물려주고, 스스로는 객체화되지 않겠다고 선언하는 역할을 한다.

* 상속받지 클래스 외에 다른 객체를 구현하지 못 하게 하여, 정보의 무결성을 유지해주는 역할을 한다. 

 

> abstract 로 선언된 class는 직접 객체화될 수 없다. (간접 객체화: 상속된 자식을 통한 객체생성만 가능)

abstract class Person(){}

public class TestAbstract {
	public static void main(String[] args) {
		//Person p = new Person()
        	//error
	}
}

 

간접 객체화 

abstract class Person(){}

class Child extends Person{
	Child(){ // 자식 생성자에
    		super(); // 부모 생성자가 들어가 멤버의 역할을 한다
        }

public class TestAbstract {
	public static void main(String[] args) {
		//Person p = new Person()
        	//error
            	new Child(); //자식 클래스가 객체화되어 역할을 할 수 있다
	}
}

 

 

2) abstract method

: 상속받은 자식 class에게 기능 구현을 강제하기 위해 사용한다.  (일관성 유지)

* ex) 부모가 study 메서드를 abstract으로 구현하면, 자식은 반드시 오버라이딩 하여 study 메서드를 구현해야 한다.

 

>  abstract로 선언된 메서드는 자식클래스에서 반드시 메서스 오버라이딩 or 구현해야 한다

구현하지 않으면 자신도 abstract class로 선언되어야 한다.

> abstract method는 구현부 { } 가 존재하지 않고, 선언만 한다.

> class 내에서 abstract method가 하나 이상 존재하면, 그 class는 abstract class로 선언되어야 한다.

public abstract class AbstractMethod {
	public abstract void study();
}

 


[ 디자인 패턴 ] 

: Template Method Design Pattern 

→ 부모 클래스에서 작업처리의 흐름을 정의하고, 자식 클래스에서 작업처리의 내용을 구체화하는 패턴 => 표준화를 위해서 ! 

*  외부에서 편리하게 사용할 수 있도록 메서드를 제공 -> 작업 절차(or 처리 흐름)를 정의

 

예제로 알아보자 ! 

- 피자 가게 사장님이 부모 클래스에 도우깔기(), 토핑(), 자르기(), 굽기() 메서드를 피자만들다()에 넣을 경우,

다른 알바생이 피자를 만들 때 자식클래스에 피자만들다() 메서드를 상속받았을 때, 피자마다 토핑이 다르기 때문에,

이럴 경우에 토핑() 메서드에 abstract를 적용하여, 피자마자 다른 토핑()을 오버라이딩하고 구현하도록 한다. 

예제링크 → https://creamilk88.tistory.com/27

 

CODE [20.07.23/Day_11] Java SE / Method, Static, Abstract, Interface 인터페이스

[ Method ] 메서드에 리턴값이 없을 때, void를 명시한 경우의 사용과 메서드에 리턴타입이 명시되고 리턴값이 있을 떄 사용되는 경우의 특징을 공부하는 예제 VO class /ATM.java public class ATM { int money;..

creamilk88.tistory.com

 

 

 

 

728x90
반응형