📢 오늘의 목표 📢
✔️ Java 문법 강의 수강
✔️ 어제 못 한 2주 차 숙제
✔️ 3주 차 강의
✔️ 개인 과제 워밍업
⏱️ 오늘의 일정 ⏱️
9:00 ~ 10:00 - 어제 못 한 2주 차 숙제
10:00 ~ 13:00 - 개인 공부 (강의 듣기)
13:00 ~ 14:00 - 점심시간
14:00 ~ 14:30 - 팀 회의
14:30 ~ 16:30 - 개인 공부 (강의 듣기)
16:30 ~ 18:30 - 개인 과제 워밍업
18:30 ~ 19:30 - 저녁 시간
19:30 ~ 20:00 - 개인 공부 (강의 숙제)
20:00 ~ 21:00 - TIL 작성
📜 Chapter 1. 어제 못 한 2주 차 숙제
9:00 ~ 10:00 - 어제 못 한 2주 차 숙제
✔️ Java 문법 강의 수강
✔️ 어제 못 한 2주 차 숙제
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String col = sc.nextLine();
String title = sc.nextLine();
String recipe = sc.nextLine();
switch (col) {
case "List":
ArrayList<String> list = new ArrayList<>();
while (!recipe.equals("끝")) {
list.add(recipe);
recipe = sc.nextLine();
}
System.out.println("[ List로 저장된 " + title + ']');
for(int i = 0; i < list.size(); i++) {
System.out.println(i + 1 + ". " + list.get(i));
}
break;
case "Set":
LinkedHashSet<String> set = new LinkedHashSet<>();
while (!recipe.equals("끝")) {
set.add(recipe);
recipe = sc.nextLine();
}
System.out.println("[ Set으로 저장된 " + title + ']');
Iterator iterator = set.iterator();
for (int i = 0; i < set.size(); i++) {
System.out.println(i + 1 + ". " + iterator.next());
}
break;
case "Map":
Map<Integer, String> map = new HashMap<>();
int index = 0;
while (!recipe.equals("끝")) {
map.put(index, recipe);
index++;
recipe = sc.nextLine();
}
System.out.println("[ Map으로 저장된 " + title + ']');
for(int i = 0; i < map.size(); i++) {
System.out.println(i + 1 + ". " + map.get(i));
}
break;
}
}
}
List, Set, Map 각각에 대해 출력을 하도록 switch 문을 사용하였다.
Set의 경우 숙제 힌트를 좀 참고하였는데 Set은 순서가 없는 저장소라 배웠기 때문에 과연 입력 순서가 지켜질까 하는 생각이 들었기 때문이다.
https://codemanager.tistory.com/107
Java - Set 순회하는 방법 (iteration)
자바에서 Set 자료구조 반복문을 어떻게 구현하는지 알아보겠습니다. 1. for loop import java.util.HashSet; import java.util.Set; class Example { public static void main(String[] args) { Set sets = new HashSet(); sets.add("A"); sets.a
codemanager.tistory.com
그런데 위 포스팅을 보면 그냥 향상 for문을 사용했어도 괜찮았을 것 같다.
자바[JAVA] : Set - HashSet / TreeSet / LinkedHashSet 알아보기.
- Set - 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다. - 인덱스로 요소들을 관리하지 않는다. 예를 들어 나의 판매사이트의 하루 방문자 수(중복 접속을 제외한)를 구하
doompok.tistory.com
애초에 LinkedHashSet을 사용하는 것 만으로 저장 순서를 유지할 수 있었던 듯!
몰랐는데 그냥 힌트에서 LinkedHashSet을 사용해서 그대로 썼었다. ㅋㅋ
📜 Chapter 2. Java 문법 강의 수강 - 3주 차
10:00 ~ 13:00 - 개인 공부 (강의 듣기)
14:30 ~ 16:30 - 개인 공부 (강의 듣기)
19:30 ~ 20:00 - 개인 공부 (강의 숙제)
✔️ Java 문법 강의 수강
✔️ 3주 차 강의
오늘도 개인적으로 중요하다고 생각하는 것, 자바만의(주로 C#과는 다른) 특징과 같은 것에 대해서만 정리했다.
✔️ 객체지향 프로그래밍?
내가 생각하는 객체지향은 "기능 별로 쪼개는 것"이다.
현실의 객체를 소프트웨어의 객체로 옮겨와 구현하니 프로그래밍이 편하도록 설계한 거라지만,
솔직히 처음 배울 때 개념 이해도 어렵고 어떻게 만들어야 할지 감도 안 잡혀서 개인 프로젝트 때 엄청 헤맸던 기억뿐이다.
지금도 100퍼센트 이해하고 활용하느냐? ㄴㄴ 한 60퍼센트 정도까지 간 것 같다.
객체 간의 관계
- 사용 관계: a가 b를 사용한다?
- 포함 관계: a가 b에 포함된다(b에서 a의 필드 or 메서드 사용)
- 상속 관계: a가 b를 상속한다
보통 포함 관계와 상속 관계를 비교하는 건 많이 봤지만 사용 관계는 예시도 두리뭉실하고 무슨 의미인지 잘 모르겠다.
객체지향 프로그래밍의 특징
- 캡슐화: 필드, 메서드를 묶어 객체로 만든 후 내부 구현 내용을 외부에서 알 수 없게 한다. (보안, 사용성)
- 상속: 필드와 메서드를 자식에게 물러준다. (구조 파악, 일관성, 재사용성)
- 다형성: 객체가 가지고 있는 고유한 특성에 따라 여러 가지 형태로 재구성되는 것.
- 추상화: 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것.
지루한 이야기지만 객체지향 프로그래밍에서 빼놓을 수 없는 부분이라 가볍게 정리하였다.
✔️ 클래스 생성 step
1. 만들려는 설계도를 선언(클래스 선언)
2. 객체가 가지고 있어야 할 속성(필드)을 정의
3. 객체를 생성하는 방식을 정의(생성자)
4. 객체가 가지고 있어야 할 행위(메서드)를 정의
public class Car {
// <필드 영역>
// 1) 고유 데이터 영역
String company; // 자동차 회사
// 2) 상태 데이터 영역
double speed; // 자동차 속도
// 3) 객체 데이터 영역
Tire tire; // 타이어 객체
// <생성자 영역>
public Car() {}
// <메서드 영역>
public double gasPedal(double kmh) {
speed = kmh;
return speed;
}
}
✔️ 가변길이 매개변수
public void carSpeeds(double ... speeds) {
for (double speed : speeds) {
System.out.println("speed: " + speed);
}
}
가변길이 매개변수란 개수가 상관없는 매개변수이다.
자바에서는 가변길이 매개변수를 ...을 붙여 사용한다.
✔️ 인스턴스 멤버와 클래스 멤버. static
인스턴트 멤버, 클래스 멤버라는 표현을 별로 들어본 적이 없었는데 클래스 멤버 = static 멤버였다.
인스턴트 멤버는 인스턴트로 생성 되어야만 사용할 수 있는 멤버,
클래스 멤버는 인스턴트로 생성되지 않아도 클래스 자체로 사용할 수 있는 멤버.
static을 변수 타입 앞에 붙이면 클래스와 같은 위치에 저장되고, 인스턴트로 생성할 때 새로 생성되지 않는다.
즉 한 클래스의 모든 인스턴트에서 공통으로 사용하게 되는 것
static int number;
✔️ 상수 final, static final
final을 변수 타입 앞에 붙이면 상수가 된다.
또 이 상수는 인스턴트 별로 다를 필요가 없기 때문에 보통 static final이라는 형태로 자주 사용된다.
통용적으로 변수 이름을 전부 대문자로 표기한다.
final int NUMBER;
static final int NUMBER;
✔️ package
자바에서의 namespace 기능이라고 이해했다.
신기하게도 디렉토리 구조를 그대로 따라간다.
네임스페이스에 대해 직관적이라 훨씬 편한 것 같다.
패키지 개념이 있기 때문에 다른 언어에서는 없는 default 접근 제어자도 존재한다.
- default: 패키지 안에서만 접근 허용
✔️ 상속
상속이란 부모 클래스에서 필드, 메서드를 물려받아 사용하는 것.
개인적으로는 중복 코드가 많아질 것 같으나 각자에게만 필요한 필드, 메서드 또한 존재하는 경우 사용한다.
상속을 잘 써야 개발 잘하는 사람이라고 학교에서도 회사에서도 정말 많이 들었다. 그런데 정말이다.
나도 잘 못 쓴다. 미리 어디에 상속을 적용하자 계획을 세우지 못한다...
https://mountain-noroo.tistory.com/113
[Unity] 키우기 게임 개발 일지 Day 10
MainScene UI 개발 작명이 마음에 들지 않아 Global에서 MainScene으로 바꿨다. 메인 씬의 UI구나 하는 느낌이 들 수 있게끔 말이다. UI 연결하기 우선 각 메뉴의 Presenter, UIPresenter, UIView와 캔버스를 만들었
mountain-noroo.tistory.com
위 포스팅이라던지 뱀서 라이크를 만들 때 무기 클래스에 적용했던 거라던지 상속은 지금도 자주 사용하고 있으나...
대부분이 개발 도중 아 이거 중복도 너무 많고 리팩토링을 좀 하고 싶다고 생각이 들고서야 부랴부랴 적용한다 ㅋㅋ
✔️ final 클래스, final 메서드
final 클래스: 최종적인 클래스. 더 이상 상속할 수 없다.
final 메서드: 최종적인 메서드. 더 이상 오버라이딩 할 수 없다.
public final class foo {}
public final void foo() {}
✔️ Object
모든 클래스들의 최상위 부모 클래스.
- Unity의 MonoBehaviour
- Unreal의 UObject
✔️ super
C#의 base이다.
부모 클래스를 지칭한다.
this의 부모 클래스 버전.
✔️ instanceof
해당 인스턴스가 제시한 클래스와 일치하는지 판별하여 boolean 값을 반환하는 연산자이다.
C#에서 as를 사용하면 형변환에 실패했을 경우 null을 반환했었는데 비슷한 상황에서 사용할 수 있어 보인다.
(이후 자바의 리플렉션에 대해 더 공부할 필요가 있을 것 같아 보임)
그런데 instanceof에 대해 자세히 알아보려고 구글에 검색해 봤더니 지양하자는 포스팅이 나온다.
https://tecoble.techcourse.co.kr/post/2021-04-26-instanceof/
instanceof의 사용을 지양하자
instanceof란? 우리는 종종 그림과 같이 부모를 상속해서 만들어진 자식 객체가 여러 타입인 경우에 특정 클래스가 맞는지 확인하기 위해 아래 코드와 같이 라는 메서드를 사용하곤 한다. 코드는 pi
tecoble.techcourse.co.kr
instanceof 대신 다형성을 이용하자는 글인데 객체지향에 위배되고 성능도 떨어진다는 것 같다.
SOLID 원칙에 대해서도 이야기하고 있는데 난 여기까지는 잘 모르는 부분이라... 다음에 공부하기로 기약했다.
✔️ 인터페이스
다중 상속은 할 수 없다.
추가적으로 상속과 유사한 기능을 사용하기 위해 클래스가 아니라 인터페이스를 사용한다.
인터페이스는 implements로 가져온다.
다만, 인터페이스 간의 상속을 할 때는 extends를 사용해야 한다!
default 메서드: 인터페이스 내에 추상화되지 않은 메서드를 만들 수 있다.
static 메서드: 클래스의 static과 동일하다.
✔️ 숙제
개인 과제와 동일하게 계산기 만들기라서 시간이 많이 걸릴 줄 알았는데 전혀 아니었다.
AbstractOperation 클래스
public abstract class AbstractOperation {
public abstract double operate(int firstNumber, int secondNumber);
}
AddOperation 클래스
public class AddOperation extends AbstractOperation {
@Override
public double operate(int firstNumber, int secondNumber) {
return firstNumber + secondNumber;
}
}
Caclulator 클래스
public class Calculator {
public AbstractOperation operation;
// 생성자에 operation 전달
public Calculator(AbstractOperation operation) {
this.operation = operation;
}
// 계산 메서드 호출시 operation의 operate 메서드 호출
public double calculate(int firstNumber, int secondNumber) {
return operation.operate(firstNumber, secondNumber);
}
// setter
public void setOperation(AbstractOperation operation) {
this.operation = operation;
}
}
1. 연산을 담당할 추상 메서드 하나를 가진, 연산자 클래스를 만든다.
2. 사직연산 자식 클래스를 만들고 연산 메서드를 구현한다.
3. 계산기 클래스를 만들고 연산자 필드를 넣어, 계산 메서드가 호출될 시 연산자 필드의 연산 메서드를 수행한다.
생성자, 세터에 대한 이야기는 과제 가이드라인에 따로 없었지만 편의를 위해 넣었다.
📜 Chapter 3. 개인 과제 워밍업
16:30 ~ 18:30 - 개인 과제 워밍업
✔️ 개인 과제 워밍업
강의 분량 안 그래도 많은데 정리까지 해가면서 하다 보니 4시가 되어서도 강의를 다 못 들었다.
원래 4시부터 학습법 특강이 있었는데 취소되었고... 도저히 강의를 들을 집중력이 남지 않았어서,
완강하고 하려고 했던 개인 과제를 좀 미리 시작했다.
인텔리제이에서 git을 연동하는 방법이 있대서 이번 과제에서는 적용해보려 하는데, 분명 이게 더 간편한 방법일 텐데 평소 소스트리를 사용했다 보니 오히려 헷갈린다.
스켈레톤 코드를 사용할 수도 있지만 나는 처음부터 하나하나 만들고 싶었다.
새 프로젝트를 만들고, 패키지와 클래스를 그대로 작성하였다.
그리고 init 커밋까지 하고 보니... 그래들이 없다... 저거 어떻게 추가하지?
Unity 하면서 정말 많이 봤던 거라 저게 java 빌드에 필요한 파일이라고 알고는 있는데,
저걸 어떻게 추가하는지 없으면 안 되는 건지 몰라 애를 먹었다.
https://yozm.wishket.com/magazine/detail/1700/
자바 빌드 도구 ‘Gradle’의 특징과 사용 팁 | 요즘IT
자바 프로젝트를 진행하다 보면 다양한 빌드 도구(Build Tool)를 접하게 됩니다. 이번 글에서는 자바 프로젝트에서 사용되는 빌드 도구의 종류와 차이점을 살펴보고, 그중에서도 최근에 주로 사용
yozm.wishket.com
아. 처음 프로젝트를 생성할 때 체크해야 했던 거구나!
다행히도 Gradle 프로젝트로 변경하는 방법이 존재하는 것 같다.
https://www.jetbrains.com/help/idea/gradle.html#convert_project_to_gradle
Gradle | IntelliJ IDEA
www.jetbrains.com
build.gradle이라는 파일을 추가하고 샘플 코드를 입력하면 되는 듯.
plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
sourceSets {
main {
java {
srcDirs = ['src']
}
}
}
dependencies {
compile 'junit:junit:4.12'
}
그런데 그대로 따라 쳤는데도 오류가 난다!
compile이라는 메서드가 없다는 건데... 그래 들 4.10 버전 이후로 사라졌다고 한다.
implementation으로 대체되었으니 수정해 주면 오류가 사라진다.
// 수정 전
dependencies {
compile 'junit:junit:4.12'
}
// 수정 후
dependencies {
implementation 'junit:junit:4.12'
}
그리고 settings.gradle 파일을 추가하고
rootProject.name = 'projectName'라는 코드를 추가하라고 한다.
rootProject.name = 'java_personal_project'
✔️ 되는 건 되는 거고
아무튼. 결국은 새로 프로젝트 생성하기를 택했다.
지금은 잘 되는 것 같지만 뭔가 내가 놓친 부분이 있을 수도 있고, 이로 인하여 나중에 문제가 생길 수도 있기 때문이다.
이미 문제를 발견했을 때 그냥 다시 만들어야지! 생각하고 있었다.
그냥 해결 과정을 경험해 보고 싶었을 뿐. ㅋㅋ
중간에 허튼짓을 많이 했더니 과제는 시작도 못 하고 프로젝트 생성에만 시간이 너무 많이 걸렸다.
https://github.com/MetroDefro/java_personal_project
GitHub - MetroDefro/java_personal_project: 내일배움캠프 자바 개인 과제
내일배움캠프 자바 개인 과제. Contribute to MetroDefro/java_personal_project development by creating an account on GitHub.
github.com
커밋 작성자가 데스크톱 이름으로 되어있는 게 신경 쓰이는데 오늘은 이만 하고 다음에 커밋할 때 방법을 찾아봐야겠다.
🌙 오늘을 마치며 🌙
강의 시간을 보고 분명 널널하게 하루 계획을 세우고 시간 남으면 내일 분량도 하려고 했는데 어림도 없지!
내일은 강의 다 듣고 정말 개인 과제를 시작 해보자.
아무튼 고생했다.
'공부 기록 > 내배캠Java_5기' 카테고리의 다른 글
[내배캠][TIL] 9일 차 - 목요일, 알고리즘 문제 풀이 시작과 개인 과제 (1) | 2024.04.25 |
---|---|
[내배캠][TIL] 8일 차 - 수요일, 자바 강의 끝! (1) | 2024.04.24 |
[내배캠][TIL] 6일 차 - 월요일, 프로그래밍 기초 챕터 시작 (1) | 2024.04.22 |
[내배캠][TIL] 5일 차 (0) | 2024.04.19 |
[내배캠][TIL] 1일 차 +a (0) | 2024.04.15 |