[ 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
'JAVA SE > 이론 및 개념' 카테고리의 다른 글
[20.07.27/Day_13] Java SE / Scanner 스캐너, Collection 컬렉션 (set, list) (0) | 2020.07.27 |
---|---|
[20.07.24/Day_12] Java SE / Interface 인터페이스 (2) | 2020.07.24 |
[20.07.21/Day_10] Java SE / Polymorphism Array 다형성 배열 (0) | 2020.07.21 |
[20.07.20/Day_09] Java SE / Polymorphism 다형성, Object down casting 다운캐스팅, instance of 연산자 (0) | 2020.07.20 |
[20.07.17/Day_08] Java SE / Inheritance 상속 (0) | 2020.07.16 |