728x90
반응형
[ Method ]
메서드에 리턴값이 없을 때, void를 명시한 경우의 사용과
메서드에 리턴타입이 명시되고 리턴값이 있을 떄 사용되는 경우의 특징을 공부하는 예제
VO class
/ATM.java
public class ATM {
int money;
// 입금 메서드 -
public void deposit(int money) {
// money에 입금받는 money만큼이 추가가 됨
this.money += money;
}
// 출금 메서드
public int withdraw(int money) {
// money에 출금하는 money만큼 감소가 됨
this.money -= money;
return money;
}
}
- deposit : 입금 메서드
리턴값이 필요가 없으므로 void로 선언 - withdraw : 출금 메서드
리턴 값이 필요 ←돈이 필요하기 때문에
* money의 타입이 int이므로 void대신 리턴값의 형(int) 로 명시한다
main class
/ TestATM.java
public class TestATM {
public static void main(String[] args) {
ATM atm = new ATM();
// 고객이 200을 입금한다
atm.deposit(200); // money = 200
// 고객이 100을 출금한다
int total = atm.withdraw(100); // total = 100
System.out.println("잔고에 남은 금액: "+total);
//아래와 같이 바로 출력 가능
System.out.println("잔고에 남은 금액: "+atm.withdraw(100));
/* 출력:
* 잔고에 남은 금액 : 100
* 100
*/
}
}
- atm.deposit(200);
deposit void 메서드는 실행하고 반환값은 없음 - int total = atm.withdraw(100);
withdraw함수는 리턴값이 있으므로 출금액을 반환받아 변수(total)에 저장
[ Static ]
class Person{
// class의 member
// 별도의 객체 생성없이 사용 가능
static int age = 21;
public static void eat() {
System.out.println("static eat");
// play(); //error : non-static error
// static eat()메서드는 객체 생성없이 실행가능하고,
// play() 메서드는 반드시 객체가 생성되어야만 실행하기 때문에 compile error가 발생한다
}
// non-static 즉, Object의 멤버(메서드)는 객체 생성이 필요하다
public void play() {
System.out.println("object play");
eat(); // 되는 이유는 play()가 실행되었따는 것은, 객체 생성을 전재로 하고,
// 객체 생성 전에 class loading이 일어나기 때문에 당연히 접근 가능
}
}
public class TestStatic2 {
public static void main(String[] args) {
//age는 static이므로 별도의 객체 생성없이 사용할 수 있다
// 프로그램 실행 시 첫시점에 class loading이 되고, 그 때 static이 메모리에 적재된다
System.out.println(Person.age);
Person.eat();
/* 출력값:
* 21
* static eat
*/
//Person.play(); //error : Object의 멤버이므로 객체 생성 필요
Person p = new Person();
p.play(); // 객체 생성 후 메소드 사용 가능
/* 출력값:
* object play
* static eat
*/
}
}
parseInt(String s) 예제
public class TestStatic3 {
public static void main(String[] args) {
String s1 = "1";
int s2 = 8;
//문자열이 앞에 나오면 이후 연산은 문자열로 인식
System.out.println(s1+s2); //18
//문자열을 String을 정수로 변환
// java.lang.Integer의 static method인 parseInt(String s)을
// 활용해서 문자열을 정수로 변환
int i = Integer.parseInt(s1); //1(int type)
System.out.println(i + s2); // 9
}
}
static의 누적을 보여주는 예제
package step3;
class Fish{
// Object의 member로 객체 생성시
// heap영역의 각자 객체 공간에 새롭게 각각 초기화
int count;
// 실행 첫 시점에 class loading때, static이 초기화됨
// method area(class area)영역에 하나의 공간에 저장됨
static int scount;
Fish () {
count++;
scount++;
}
}
public class TestStatic4 {
public static void main(String[] args) {
Fish f1 = new Fish();
System.out.println(f1.count);
System.out.println(f1.scount);
Fish f2 = new Fish();
System.out.println(f2.count);
System.out.println(f2.scount);
Fish f3 = new Fish();
System.out.println(f3.count);
System.out.println(f3.scount);
/* 출력값:
* 1
* 1
* 1
* 2
* 1
* 3
*/
}
}
[ Abstract ]
예제 1)
main class
public class TestAbstract1 {
public static void main(String[] args) {
// abstract class이므로, 직접 객체 생성이 안된다
// Parent p = new Parent();
// 간접 생성 방법
Child c = new Child();
/*
* 출력값: Parent 객체 생성
* Child 객체 생성
*/
c.study(); // 자식 클래스에서 오버라이딩된 메서드
/*
* 출력값: Child 공부하다
*/
c.eat(); // 부모 클래스 메서드
/*
* 출력값: 먹다
*/
}
}
VO class
abstract 부모클래스 | Parent.java
//abstract method가 하나 이상 존재하면 그 클래스는
//abstract로 선언되아야 한다.
abstract class Parent {
public void eat() {
System.out.println("먹다");
}
// abstract 메서드는 구현부{}를 가질 수 없다
// 오직 선언만 한다
public abstract void study();
}
자식클래스 | Child.java
class Child extends Parent {
// 생성자
public Child() {
super(); // 부모클래스 생성자 구현
System.out.println("Child 객체 생성");
}
// 자식클래스에 구현 강제
@Override
public void study() {
System.out.println("Child 공부하다");
}
}
예제 2) Template Method Design Pattern
main class
/TestPizzaService.java
package step8;
import step7.PotatoPizzaService;
public class TestPizzaService {
public static void main(String[] args) {
//포테이토 피자를 만들기 위해 메서드 호출
PotatoPizzaService potato = new PotatoPizzaService();
potato.makePizza();
System.out.println("=========================");
//씨푸드 피자도 만들어보자
SeaFoodPizzaService seafood = new SeaFoodPizzaService();
seafood.makePizza();
/* 출력값:
* 도우를 만들다
* 감자 토핑을 올리다
* 굽다
* 자르다
* 포장하다
* =========================
* 도우를 만들다
* 해산물 토핑을 올리다
* 굽다
* 자르다
* 포장하다
*/
}
}
VO class
/PizzaService.java - super class(abstract)
package step6;
/*
* abstract class
* : 자식에게 유용한 멤버를 상속시킬 뿐,
* 스스로 직접 객체화되지 않는다.
* 오로지 자식 객체 생성을 통해서만 객체생성이 가능하다
*/
public abstract class PizzaService {
protected void preparing() {
System.out.println("도우를 만들다");
}
// 부모차원에서 구현할 수 없고,
// 반드시 자식클래스에서 구현해야 하는 메서드
// abstract method로 선언한다
protected abstract void topping();
protected void baking() {
System.out.println("굽다");
}
protected void cutting() {
System.out.println("자르다");
}
protected void boxing() {
System.out.println("포장하다");
}
public void makePizza() {
preparing();
topping();
baking();
cutting();
boxing();
}
}
/PotatoPizzaService.java - sub class 1
package step7;
import step6.PizzaService;
public class PotatoPizzaService extends PizzaService{
@Override
protected void topping() {
System.out.println("감자 토핑을 올리다");
}
}
/SeaFoodPizzaService.java - sub class 2
package step8;
import step6.PizzaService;
public class SeaFoodPizzaService extends PizzaService{
@Override
public void topping() {
System.out.println("해산물 토핑을 올리다");
}
}
[ Interface ]
728x90
반응형
'JAVA SE > Code' 카테고리의 다른 글
CODE [20.07.27/Day_13] Java SE / Random, Collection 컬렉션 (list) (0) | 2020.07.27 |
---|---|
CODE [20.07.24/Day_12] Java SE / Interface 인터페이스 (0) | 2020.07.24 |
CODE [20.07.20/Day_09] Java SE / Polymorphism 다형성, object down casting 다운캐스팅 (0) | 2020.07.20 |
CODE [20.07.17/Day_08] Java SE / 접근제어자, Inheritance 상속 (0) | 2020.07.17 |
[20.07.15/Day_06] Java SE / Array 배열 (0) | 2020.07.15 |