
2024년도 공개SW 개발자대회 입상을 하는 과정에서 오픈소스 프로젝트에 대해 관심을 가지게 되었고, 3학년 2학기 소프트웨어 공학을 들으며 OOAD, UML, MDE 등 설계 분야에 관심을 가지게 되어 내년 상반기 SWE 분야의 Spring Boot 오픈소스 라이브러리 개발 프로젝트를 진행하고자 한다.
따라서, 이를 위해 학습한지 시간이 오래 지난 Java 언어를 먼저 복습하고 이후 Spring Boot 및 Kotlin을 다시 1월 내에 공부하여 이후의 프로젝트를 진행하고자 한다.
위와 같은 계획의 시작점으로 Inflearn에서 제공하는 위 무료 강의를 학습하는 중 기존 개발을 진행하면서 헷갈렸거나, 지나쳤던 Java의 내용을 정리하고자 해당 포스트를 작성하게 되었다.

Garbage Collector (C의 경우 malloc() -> free())class ClassName{
public static void main(String[] args){
}
}
java.lang.Object
Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.
https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
java.lang.Object를 포함하는 Class
switch( 표현식 ){
case 값1 :
break;
case 값2 :
break;
...
default:
break;
}
int [] nArray; // 대체로 해당 형태 선호
int nArray[];
위는 참조형 배열변수의 선언부 (일종의 Alias로 생각할 수도 있다)
nArray = new int[10];
이후 new 키워드를 통해서 nArray라는 객체가 생성된다 (Object = Data + Operation)
C에서는 malloc()을 통해서 새로운 메모리 공간을 할당하였는데, Java 에서는 new를 사용
// 선언과 동시에 초기화 가능
int [] nArray = {1, 2, 3};
int [][] nArray = { {1, 2}, {3, 4} };
class 클래스명{
// field : 클래스 내부에 선언된 변수 (멤버변수)
// constructor : 생성자
// method : 클래스 내부에 선언된 함수
}
new 키워드를 사용하여 객체를 생성하고, .을 통해 객체 내부에 접근 가능

private : 같은 Class 내부에서만 접근 가능 (하위 Class에서 접근 불가)public : 전체에서 접근 가능protected : 같은 Class와 Package, 하위 Class에서 접근 가능friendly (default) : 같은 Class와 Package 안에서만 접근 가능
Overriding : 상속받은 하위 Class에서 동일한 이름을 가진 메소드를 재정의하는 것Overloading : 중복되는 메소드 명을 같은 Class 내에서 정의할 수 있도록 하는 것class MyClass{
public MyClass(){
}
public MyClass(int nVar1, int nVar2){
}
}
this() // this와는 다름
this()를 활용하면 생성자 첫 줄에서 다른 생성자를 호출할 수 있다접근제어자 static 데이터타입 멤버변수명;
접근제어자 static 리턴타입 메소드명(...);
객체가 생성되기 이전에 static한 멤버변수와 메소드 사용 가능 (ex. String)
public static void main(String[] args)는 static이기 때문에 JVM에서 바로 사용
멤버변수는 생성되는 모든 객체에서 전역변수로 사용 가능
사용 규칙
a. static 메소드 내에서는 static한 멤버 변수만을 사용할 수 있다
b. static 메소드는 같은 Class 내의 static 메소드만을 호출할 수 있다
c. static 메소드 내에서는 this를 사용할 수 없다 (객체 생성 이전이기 때문에)
(this는 객체가 생성된 이후에 객체 내의 요소들을 참조한다)
d. static 메소드는 오버라이딩이 불가하다
package 패키지명
package mypackage.utility;
import 패키지명.클래스명;
import 패키지명.*;


class 클래스명 extends 상속 클래스명 {
}
이때 상위 상속 Class의 접근지정자에 따라 접근이 제한된다
private : 상속받은 하위 Class에서 사용할 수 없다
public : 상속받은 하위 Class뿐 아니라 외부에서도 사용 가능하다
protected : 같은 Package에서는 public 처럼 사용 가능하지만, 다른 package에서는 상속받은 하위 Class에서만 사용가능하고 외부에서는 사용할 수 없다
default (friendly) : 같은 Package에서는 public 처럼 사용 가능하지만 다른 package에서는 상속받은 하위 Class 및 외부에서 사용할 수 없다
부모 Class의 메소드를 자식 Class에서 재정의 (함수명, 매개변수, 리턴타입이 같아야 함)
final class FinalClass { // FinalClass는 상속이 불가
public void Print() { ... }
}
class A {
final void FinalMethod() { ... } // FinalMethod는 오버라이딩이 불가
}
class A {
static final float finalVar = 3.14; // finalVar 수정이 불가
}
class A {
public A() { System.out.print("A "); }
}
class B extends A {
public B() { System.out.print("B "); }
}
class C extends B{
public C() { System.out.print("C "); }
}
...
C c = new C();
A B C
super 키워드 사용super 키워드는 하위 Class에서 상위 Class를 참조하여 접근할 때 사용class A {
int aVar;
public A(int aVar) {
this.aVar = aVar;
System.out.print(aVar);
}
}
class B extends A {
public B(int bVar) {
super(bVar);
}
}
B b = new B(10);
10
또한 매개변수가 없는 경우 super 키워드가 생략되었다고 생각해도 무방하다
class A {
public A() {
System.out.print("A ");
}
}
class B extends A {
public B() {
// super()
System.out.print("B ");
}
}
class C extends B{
public C() {
// super()
System.out.print("C ");
}
}

( ) 사용class Main{
public static void main(String[] args){
C c = new C();
B b = new C(); // 하위 Class를 상위 Class로 생성
A a = (a) c; // 하위 Class를 상위 Class로 형변환
a.printA(); // C Class가 형변환된 A에서 printA() 접근 가능
b.printB(); // C Class로 생성된 C에서 printB() 접근 가능
}
}
class A {
public void printA() { System.out.print("A "); }
}
class B extends A {
public void printB() { System.out.print("B "); }
}
class C extends B{
public void printC() { System.out.print("C "); }
}
생성된 하위 Class에서 상위 Class 형 변환을 통해 하위 Class의 멤버에 접근 불가
상위 Class의 메소드가 하위 Class에서 오버라이딩된 경우 상위 Class 참조변수에서 오버라이딩된 메소드를 호출하면 하위 Class의 메소드가 실행

abstract class 클래스명{
일반 멤버 변수;
메소드;
생성자;
abstract 반환형 메소드명(...);
}

interface 인터페이스 명 {
데이터형 변수명 = 값;
리턴타입 메소드명 ( ... );
}
// Interface는 ~able로 명명하는 관례가 있다
// ex. Openable, Readable
class 클래스명 implements 인터페이스명{
}
Abstract Class = 일반 멤버 + 추상 메소드 vs Interface = 추상 메소드 + 상수
Interface는 하위 Class에서 모든 것을 구현해야 함 (강제성)
다중 상속 가능 (+ Interface가 Interface 다중 상속 가능)
interface A { ... }
interface B { ... }
interface C extends A, B { ... }
interface A { ... }
interface B { ... }
class C { ... }
class D extends C implements A, B { ... }
class 클래스명 {
class 내부클래스명 {
...
}
}
인스턴스 내부 Class, 정적 내부 Class, 지역 내부 Class로 나눌 수 있음클래스명 클래스변수 = new 클래스명() {
멤버변수와 메소드 선언
};
인터페이스 인터페이스변수 = new 인터페이스명(){
변수와 메소드 선언
};

에러 : 수정할 수 없는 것 vs 오류 : 수정 가능, 알려주는 역할try{
예외가 발생할 수 있는 코드
} catch(Exception e){ // 관례적으로 e라고 많이 사용한다
예외가 발생했을 때의 처리
} catch(Exception e){
...
} ...
| 예외 클래스 | 역할 |
|---|---|
| ArithmeticException | 산술 연산 중 예외적인 상황(예: 0으로 나누기)이 발생했을 때 발생. |
| ArrayIndexOutOfBoundsException | 배열의 잘못된 인덱스에 접근하려 할 때 발생. |
| ClassCastException | 객체를 해당 클래스의 인스턴스가 아닌 클래스로 캐스팅하려 할 때 발생. |
| IllegalArgumentException | 메서드가 부적절하거나 허용되지 않는 인자를 받았을 때 발생. |
| IllegalStateException | 메서드가 부적절하거나 허용되지 않는 시점에서 호출되었을 때 발생. |
| IndexOutOfBoundsException | 배열, 리스트, 문자열 등에서 범위를 벗어난 인덱스에 접근하려 할 때 발생. |
| IOException | 입력/출력 작업이 실패하거나 중단되었을 때 발생. |
| NullPointerException | null 참조를 통해 객체에 접근하려 할 때 발생. |
| NumberFormatException | 문자열을 숫자로 변환하려 했으나 올바른 형식이 아닐 때 발생. |
| SecurityException | 보안 관리자가 보안 위반을 감지했을 때 발생. |
| StringIndexOutOfBoundsException | 문자열에서 유효하지 않은 인덱스에 접근하려 할 때 발생. |
| UnsupportedOperationException | 지원되지 않는 작업을 수행하려 할 때 발생. |
| FileNotFoundException | 존재하지 않는 파일에 접근하려 할 때 발생. |
| InterruptedException | 스레드가 대기, 수면 중 인터럽트(중단)되었을 때 발생. |
| ClassNotFoundException | 애플리케이션이 클래스를 로드하려 했으나 해당 클래스를 찾을 수 없을 때 발생. |
| NoSuchElementException | 열거형(enumeration) 또는 리스트에서 존재하지 않는 요소를 요청했을 때 발생. |
| RuntimeException | 실행 중 발생할 수 있는 예외들의 부모 클래스 (Unchecked Exception). |
| Exception | 모든 Checked Exception의 부모 클래스. |
| Error | 복구 불가능한 심각한 오류들의 부모 클래스. |
try{
} catch (Exception e){
} finally {
예외처리와 상관없이 항상 실행해야 하는 코드
}
반환형 메소드() throws Exception { // Exception을 throw히면 JVM에서 처리
}
| Primitive Data Type | Wrapper Class |
|---|---|
char | Character |
byte | Byte |
short | Short |
long | Integer |
float | Float |
double | Double |
boolean | Boolean |
java.lang.Object -> java.lang.Number -> java.lang.IntegerparseInt, toString, valueOf 메소드의 경우 static (객체 생성 전에 사용 가능)Integer integerVar = 12; // new Integer(12)
int intVar = 3;
int total = integerVar + intVar; // integerVar.intValue() + intVar
integerVar++; // new Integer(integerVar.intValue() + 1)
public static int Add(Integer integerVar){
int intVar = 10;
integerVar += intVar;
return integerVar;
}
java.lang.Object -> java.lang.String, 63가지의 메소드 존재java.lang.Object -> java.lang.StringBufferjava.util.Arrays
public abstact class AbstractCollection<E>
extends Object implements Collection<E>
public abstract class AbstractList<E>
extends AbstractCollection<E> implements List<E>
public class ArrayList<E>
extends AbstractList<E> implements List<E>, RandomAccess, Cloneabe
컬렉션클래스 <type> 클래스변수
= new 컬렉션클래스()