공부 내용 및 활동 내용 |
|
1. 알고리즘 기초 학습 (알고리즘 문제 해결 전략: chapter 1 ~ chapter 2)
|
1. 알고리즘 기초 학습 (알고리즘 문제 해결 전략: chapter 1 ~ chapter 2)
- 초반부 내용이라 크게 알고리즘 풀이에 대해서 나와있지는 않았지만 코딩테스트 문제 해결 전략에 대해서 설명이 되있었다. 거기에 대해서 정리한 내용을 적어보겠다.
문제 해결 전략
- 문제 해결 과정을 단계별로 나눌 것
-> 총 6단계로 나눌 수 있음
- 문제를 읽고 이해하라
- 문제를 익숙한 용어로 재정의
- 어떻게 해결할 지 계획
- 계획을 검증
- 프로그램 구현
- 어떻게 풀었는지 돌아보고, 개선 여지 찾기
하지만 여기서 풀지 못했던 문제에 대해서는
- 오답 원인을 찾고 분석해보기
2. Java 기초 학습
(Java의 정석: chapter 6. 객체지향 프로그래밍 1 ~ chapter 7 객체지향프로그래밍 2)
2 - 1 ) 추상 클래스 (Abstract Class)
- 미완성의 의미
-> 추상 클래스는 미완성 설계도 => 추상 클래스 인스턴스 생성 불가
AbstractUnit unit = new AbstractUnit(); // ERROR: 인스턴스 불가능
- 다형성 1
-> 부모와 자식 인스턴스를 만들 때,
abstract Class Unit {
int hp;
....
abstract void move (int x, int y);
}
Class Tank extends Unit () {
void move(int x, int y){
....
}
}
public class Starcraft {
public static void main(String[] args) {
Unit unit = new Unit();
Tank tank = new Tank();
Unit tank = new Tank();
Tank unit = new Unit(); //ERROR: 부보가 자신 참조 허용 X
}
}
- 다형성 2
abstract Class Unit {
int hp;
....
Unit (int hp) {
this.hp = hp;
}
abstract void move (int x, int y);
}
Class Tank extends Unit () {
Tank () {
super(300);
}
void move(int x, int y){
....
}
}
Class Marine extends Unit () {
Marine () {
super(100);
}
void move(int x, int y){
....
}
}
Class Enemy () {
int attackPower = 10;
void attack (Tank tank) {
tank.hp -= attackPower;
}
void attack (Marine marine) {
marine.hp -= attackPower;
}
}
public class Starcraft {
public static void main(String[] args) {
Tank tank = new Tank();
Marine marine = new Marine();
Enemy enemy = new Enemy();
enemy.attack(tank);
enemy.attack(marine);
}
}
물론 실행은 될것이나 대상이 marine, tank 말고 추가 된다면 각각 구현해줘야한다. 하지만 다형성이 적용이 된다면 Unit만 들어가도 문제가 없다. 우리는 이제 해당 유닛의 객체만 넣어주면 된다.
abstract Class Unit {
int hp;
....
Unit (int hp) {
this.hp = hp;
}
abstract void move (int x, int y);
}
Class Tank extends Unit () {
Tank () {
super(300);
}
void move(int x, int y){
....
}
}
Class Marine extends Unit () {
Marine () {
super(100);
}
void move(int x, int y){
....
}
}
Class Enemy () {
int attackPower = 10;
void attack (Unit unit) {
tank.hp -= attackPower;
}
}
public class Starcraft {
public static void main(String[] args) {
Tank tank = new Tank();
Marine marine = new Marine();
Enemy enemy = new Enemy();
enemy.attack(tank);
enemy.attack(marine);
}
}
여기서 오는 장점은 메인 메소드에서
abstract Class Unit {
int hp;
....
Unit (int hp) {
this.hp = hp;
}
abstract void move (int x, int y);
}
Class Tank extends Unit () {
Tank () {
super(300);
}
void move(int x, int y){
....
}
}
Class Marine extends Unit () {
Marine () {
super(100);
}
void move(int x, int y){
....
}
}
Class Enemy () {
int attackPower = 10;
void attack (Unit unit) {
tank.hp -= attackPower;
}
}
public class Starcraft {
public static void main(String[] args) {
Tank tank = new Tank();
Marine marine = new Marine();
Unit[] units = new Unit {tank, marine}; // 같이 묶을 수도 있을 것이다.
Enemy enemy = new Enemy();
enemy.attack(tank);
enemy.attack(marine);
}
}
Unit이라는 배열을 만들어서도 관리해줄 수 있을 것이다.
2 - 2 ) 인터페이스 (Interface)
- 추상 클래스가 미완성이라면, 인터페이스는 밑그림만 그려져 있음
- 인터페이스에는 상수와 추상 클래스만 존재
- 해당 추상클래스는 인터페이스를 구현(=상속) 받는 클래스에서 구현해야 사용 가능
- 인터페이스의 장점
- 개발 시간 단축: 인터페이스가 개발되는 동안, 기다리지 않고도 해당 클래스를 상속받는 클래스 구현 가능
- 표준화 가능: 일관되고 정형화
- 서로 관계없는 클래스들에게 관계 맺기 가능: 아무 관계 없는 클래스들에게 인터페이스를 공통 적으로 구현함으로써 관계 맺기 가능 ★ (개인적으로 가장 중요하다고 생각되는 부분이다. 추상클래스와의 차이점을 두드러지게 하는 장점이다)
- 독립적인 프로그래밍: 구현에 독립적인 프로그램 작성 가능
음 아직은 정확히 이해하진 못한것 같지만 글을 작성하면서 인텔리제이를 통해 작성해보고있다.
public class Main {
public static void main(String[] args) {
Unit unit = new Tank();
Flyable mutal = new Mutalisk();
Flyable corsair = new Corsair();
mutal.fly(50,50);
corsair.fly(50, 50);
}
}
abstract public class Unit {
int x;
int y;
Unit () {
}
abstract public void move (int x, int y);
}
public class Corsair extends Unit implements Flyable{
int x;
int y;
public void move(int x, int y){
}
public void fly (int x, int y) {
}
}
public class Mutalisk extends Unit implements Flyable{
public void move(int x, int y) {
}
public void fly(int x, int y) {
}
}
public class Tank extends Unit {
int x;
int y;
public void move(int x, int y) {
}
}
요런식으로 전혀 관련없는 클래스이지만 Flyable이라는 인터페이스를 만들고,
Mutalisk, Corsair 클래스에서 Flyable이라는 인터페이스를 구현했다.
3. 튜터님에게 질문한것들
1. lv.2 개인 과제에서 Queue 쪽 참조 자료형은 왜 final 경고를 주는지
- 결론적으로는 큐는 참조 자료형이라 스택에 caculator가 저장
- calculator는 heap 안에 큐의 주소값을 저장 (주소값이 바뀌면 안됨 <- 이런 것을 경고하는것)
2. 추상클래스를 왜 쓰는 것인가? ex. 스타크래프트
3.인터페이스...?
클래스를 완벽히 이해한 것 같았지만 책을 읽어보기 처음 보는 내용 같았다. 책을 읽기 잘했다는 생각이 든다. 특히 추상클래스, 인터페이스에 대해서는 아직 완벽히 이해 못한 것 같지만 주말동안 추상클래스와 인터페이스를 이용해서 자그마한 클래스를 설계하면서 숙달해보아야 할 것 이다.
'스파르타(부트캠프) > TIL (Today I Learned)' 카테고리의 다른 글
[내일배움캠프] 스파르타 18일차_24.10.22 (2) | 2024.10.22 |
---|---|
[내일배움캠프] 스파르타 17일차_24.10.21 (3) | 2024.10.21 |
[내일배움캠프] 스파르타 14일차_24.10.16 (2) | 2024.10.16 |
[내일배움캠프] 스파르타 13일차_24.10.15 (0) | 2024.10.15 |
[내일배움캠프] 스파르타 8일차_24.10.10 (4) | 2024.10.10 |