20210929 교재와 진도, 런런런

DUUUPPAAN·2021년 9월 29일
0

교육 20210915~ Java

목록 보기
10/13

·복습 생략!

-그동안 복습을 지나치게 반복한 경향이 있기 때문에 오늘은 복습을 생략하셨다. 중요한 개념이라서 자꾸 반복했지만 더이상 하면 루즈해질 수 있기 때문에, 더이상의 반복은 하지 않고, 나중에 실전 코드를 진행하면서 더 반복하는 것으로 하자고 하셨다.

·오전은 추상 클래스와 추상 메소드

-추상 클래스를 이해하기 위해선 추상 메소드를 먼저 이해해야 하는데, 간단하게 내가 이해한 바에 의하면, '틀'이다.

보통 메소드는 안의 내용을 채워준다. 예를 들면

void show(){
System.out.println("보여주세요.");
}

처럼 {}안에 실행할 것들을 입력해주는게 보통이였다.
그런데 abstract를 붙인 추상 메소드는 {}의 부분이 없다.

abstract void show();

그리고 이렇게 정의된 메소드를 추상 메소드라고 한다. 구체의 반대되는 개념이 추상이라고 생각하면, 구체적으로 정의가 되지 않은 메소드로 이해하면 되겠다.

그리고 이렇게 추상 메소드가 하나라도 쓰인 클래스는

class ABC{
abstract void show();
}

위처럼 입력할 경우 오류가 난다. 왜냐하면 추상 메소드가 쓰인 클래스는 반드시 추상 클래스로 정의되어야 하기 때문이다.

abstract class ABC{
abstract void show();
}

위와 같이 작성해야 오류가 없다.

추상 클래스에는 구체적인 메소드를 사용할 수 없는 것은 아니다.


abstract class ABC{
abstract void show();
void show2(){
System.out.println("보여주세요.");
}

}

위와 같이 show();의 추상 메소드와 , 구체적인 {}내용을 갖고 있는 show2();가 동시에 있을 수 있다.
그렇다면 저 추상 메소드를 어떻게 사용할 수 있을까?
바로 상속을 통해 자식이 상속 받고 그 메소드를 재정의하여 사용한다.
단, 추상 클래스에서 상속받은 추상 메소드는 반드시 재정의해야 한다. 오버라이딩 해도 된다가 아니라 오버라이딩을 무조건 해야한다.

class ABChild extends ABC{
@Override
void show(){
	//이 부분을 재정의해줘야 한다.
}
}

여기까지 배웠을 때 드는 의문은 이거였다. 왜 굳이 빈 메소드를 만들어서 상속시켜서 사용하는 것일까? 그냥 상속받은 애가 만들어서 쓰면 안되는 것일까?
물론 그렇게 사용해도 별 탈은 없을 것이다. 그러나 추상 클래스와 메소드를 사용하는 이유는 큰 프로젝트를 생각하면 굉장히 와닿았다.

지금이야 코드가 짧고 얼마 안되지만, 나중에는 특정 기능을 하는 프로그램이나 어플을 만들었을 때, 초반에 구현하겠다고 생각했거나, 이 기능은 꼭 있어야 한다고 체크해두는 기능들이 있을 것이다. 그런데, 막상 코딩을 시작하고 코드가 길어지면 놓치는 부분도 분명히 있을 것이다.

그런데, 이렇게 빈 메소드를 쥐어줘서 상속시켜버리면, 일종의 제약이 걸려서 그 기능을 해결하지 않으면 실행이 안되는 상황이 되어버려서 기능 누락을 줄여줄 수 있다. 이게 확실히 맞는 사용처인지는 확실하지는 않으나 개인적으로는 그런 식으로 생각을 했다. 그래서 추상클래스와 추상 메소드를 나는 틀이되는 클래스와 틀이되는 메소드라고 받아들였다. 물론 그렇게 부를 것은 아니다. 명칭은 교재를 따르겠지만, 받아들이는 의미를 그렇게 받아들이려 한다.

·다형성

-월요일날 잠깐 진행했던 다형성에 대한 내용을 진행했다. 그때는 단순히 자식이 되는 클래스의 값을 받아와서 부모클래스가 사용할 수 있다. 상속과 완전히 반대는 아니지만 비슷한 느낌으로 받아들이면 된다고 하셨었는데, 교재에서 소개한 다형성은 전혀 달라서 그 부분을 조금은 더 살펴보고 들어갔다.

abstract class Fruit{
	abstract String getName();
	abstract String getPrice();
	abstract int getFresh();
	
}

class Apple extends Fruit{

	@Override
	String getName() {
		return "사과";
	}

	@Override
	String getPrice() {
		return "5000원";
	}

	@Override
	int getFresh() {
		return 75;
	}
	
}

class Orange extends Fruit{

	@Override
	String getName() {
		return "오렌지";
	}

	@Override
	String getPrice() {
		return "10000원";
	}

	@Override
	int getFresh() {
		return 90;
	}
	
}

class FruitPrint{
	public static void fruitPrint(Fruit fruit) {
		System.out.println("이름 : "+fruit.getName());
		System.out.println("가격 : "+fruit.getPrice());
		System.out.println("신선도 : "+fruit.getFresh());
		System.out.println("--------");
	}
}

public class FruitMain {

	public static void main(String[] args) {
	Apple ap = new Apple();
	Orange or = new Orange();
	
	FruitPrint.fruitPrint(ap);
	FruitPrint.fruitPrint(or);
	}

}

다형성과 추상 클래스 추상 메소드를 활용한 코드를 진행해봤다. 여기서는 딱히 다형성이라고는 찾아볼 수 없어 보이지만,

FruitPrint.fruitPrint(ap);
FruitPrint.fruitPrint(or);

이 부분이 핵심이다. 여기서 넘어간 인자는 각각 객체 ap와 or이 담겨서
FruitPrint의 fruitPrint라는 메소드의 파라미터로 들어간다.
즉, 따로따로 나눠서 구체적으로 작성하면 fruitPrint메소드의 괄호 안은 이렇게 되어 있는 것이다.(이렇게 쓰면 안되지만 이해를 위해서)

Fruit fruit = ap;
Fruit fruit = or;

여기서 다시 ap와 or은 어떤 생성자로 정의된 객체인지를 생각하면 이렇게도 풀어쓸 수 있다.

Fruit fruit = new Apple();
Fruit fruit = new Orange();

지금 바로 위에 작성된 코드는 너무나도 익숙하다. 부모 클래스의 객체를 자식클래스의 생성자로 만들어주는 것. 바로 전에 해본 다형성이다.
즉, 위에는 객체를 보내주고 해당 객체를 객체변수로 받아서 잘 보이지는 않았지만 결국 부모가 자식의 것을 사용하는 것이 된다. 처음에 해당 코드를 접했을 때는 정말 눈이 돌아가는 줄 알았지만, 열심히 뜯어서 보니까 이해가 그렇게 어렵진 않았다. 물론 내가 과연 실제로 저렇게 활용할 수 있을지는 다른 얘기겠지만... 파이팅해보자..

·잠깐의 복습 File...너란 녀석

-예전에 했던 File을 사용하는 것을 해봤다.
메모장 파일을 만들어주는 클래스와, 그 메모장의 파일을 읽어서 내용이 있으면, 출력해주고, 없으면 출력을 하지 않고, 파일이 존재하지 않으면 예외처리를 해주는 것...
근데 정말 머릿속이 새하얗다.... 너무 예전에 한 느낌이었다.
수업시간에 진행한 것을 따라 작성하면서, 정말 복습은 그날꺼만 하면 안된다는 것을 뼈져리게 느꼈다... 그래도 하루하루 그날꺼만 복습해도 힘드니까 최대한 주말에는 꼭 다 봐야겠다. 오늘은 그래도 오늘복습을 최대한 빨리 끝내고 그간 해왔던 굵직굵직한 것들을 직접 사용해봐야겠다.

·내일은 실전처럼

-내일은 우선 오전에 다른 졸업프로젝트를 진행한 반의 수업을 청강하도록 한다고 하셨다. 같은 내용의 수업을 들은 선배(?)들은 어느정도까지 기능을 구현할 수 있을지 내심 궁금했고, 그걸 보면 나도 더 힘을 내서 "내가 저런 것도 할 수 있겠구나!"하면서 힘을 낼 수 있을 것 같다. 그래서 다른 의미로 기대가 매우 많이 된다.

-또 오후에는 지금까지 배운 내용들로 직접 코딩을 해보는 실전 문제들을 준비해서 직접 작성해보고 실행해보고 오류를 찾아보고 할 것이라고 하셨다. 역시 이론적인 부분보다 직접 응용하는 것이 중요하기에 내일 오후 수업도 굉장히 기대가 된다.
대신, 미리미리 그동안 배운 것들을 큰 틀에서라도 공부하고 가야겠다. 바로바로 작성할 수 있도록 말이다.

profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글