자바(JAVA) 언어 기본 강좌

SangYeon Min·2024년 12월 23일

STUDY-COMPUTER-SCIENCE

목록 보기
2/2
post-thumbnail

2024년도 공개SW 개발자대회 입상을 하는 과정에서 오픈소스 프로젝트에 대해 관심을 가지게 되었고, 3학년 2학기 소프트웨어 공학을 들으며 OOAD, UML, MDE 등 설계 분야에 관심을 가지게 되어 내년 상반기 SWE 분야의 Spring Boot 오픈소스 라이브러리 개발 프로젝트를 진행하고자 한다.

따라서, 이를 위해 학습한지 시간이 오래 지난 Java 언어를 먼저 복습하고 이후 Spring Boot 및 Kotlin을 다시 1월 내에 공부하여 이후의 프로젝트를 진행하고자 한다.

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94java-%EC%96%B8%EC%96%B4-%EA%B8%B0%EB%B3%B8-%EA%B0%95%EC%A2%8C/dashboard

위와 같은 계획의 시작점으로 Inflearn에서 제공하는 위 무료 강의를 학습하는 중 기존 개발을 진행하면서 헷갈렸거나, 지나쳤던 Java의 내용을 정리하고자 해당 포스트를 작성하게 되었다.


Java

  • 메모리 해제 -> Garbage Collector (C의 경우 malloc() -> free())
  • 전체 실행 과정의 경우 .java -> .class -> JVM 위에서 실행

JDK (Java Development Kit)

  • Java 프로그램 개발 도구 (컴파일러 등)
  • JRE -> JVM + 여러 표준 Class

Java의 시작

class ClassName{
	public static void main(String[] args){
    }
}
  • main은 Virtual Machine에서 호출되는데, 모든 Class가 아니라 main만을 잡아서 실행

    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

  • main Class는 java.lang.Object를 포함하는 Class

Const

  • Java는 ASCII Code가 아니라 Unicode를 기반으로 동작한다
  • 이때 ACSII와 Unicode는 0 ~ 128까지 겹치게 된다

Reference Type

  • 메모리 주소를 저장하는 4byte 데이터 Type (Class, Array, Interface etc.)

Variable

  • 상수를 저장하는 메모리 공간

Switch Case

switch( 표현식 ){
	case1 :
    	break;
    case2 :
    	break;
    ...
    default:
    	break;
}
  • 정수형 데이터 Type만 표현식과 값에 들어갈 수 있다
  • 이때 float은 정확한 값으로 표현이 불가하기 때문에, switch case에서 사용할 수 없다

Array

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} };

Java Class

class 클래스명{
	// field : 클래스 내부에 선언된 변수 (멤버변수)
    // constructor : 생성자
    // method : 클래스 내부에 선언된 함수
}

new 키워드를 사용하여 객체를 생성하고, .을 통해 객체 내부에 접근 가능

Field

  • 멤버 변수, 전역변수와 유사한 속성을 가지지만 Class 내부에서만 사용 가능
  • 객체의 속성은 곧 멤버변수이다

접근 제어자

  • private : 같은 Class 내부에서만 접근 가능 (하위 Class에서 접근 불가)
  • public : 전체에서 접근 가능
  • protected : 같은 Class와 Package, 하위 Class에서 접근 가능
  • friendly (default) : 같은 Class와 Package 안에서만 접근 가능

Overriding vs Overloading

  • Overriding : 상속받은 하위 Class에서 동일한 이름을 가진 메소드를 재정의하는 것
  • Overloading : 중복되는 메소드 명을 같은 Class 내에서 정의할 수 있도록 하는 것

Constructor

class MyClass{
	public MyClass(){
    }
    
    public MyClass(int nVar1, int nVar2){
    }
}
  • 객체가 생성될 때 최초로 한번 호출되는 메소드
  • 자동으로 호출되며, 리턴형이 없고 Class 명과 메소드 명이 같다
this() // this와는 다름
  • this()를 활용하면 생성자 첫 줄에서 다른 생성자를 호출할 수 있다

static

접근제어자 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 패키지명
package mypackage.utility;
  • 자주 사용되는 Class들을 모아놓은 폴더
  • 패키지명은 소문자로 작성하는 관례 존재

import

import 패키지명.클래스명;
import 패키지명.*;
  • 패키지의 Class를 포함하고자 할 경우 사용

Inheritance

  • 객체와 객체를 연관시키고 계층구조를 만들어 코드 재사용
  • 부모 Class = 상위 Class = Super Class
  • 오직 한 Class만을 상속할 수 있다

  • Java의 모든 Class는 Object Class를 상속받는다
    즉, Object는 모든 Class의 Parent Class이다
class 클래스명 extends 상속 클래스명 {
}

이때 상위 상속 Class의 접근지정자에 따라 접근이 제한된다

  • private : 상속받은 하위 Class에서 사용할 수 없다

  • public : 상속받은 하위 Class뿐 아니라 외부에서도 사용 가능하다

  • protected : 같은 Package에서는 public 처럼 사용 가능하지만, 다른 package에서는 상속받은 하위 Class에서만 사용가능하고 외부에서는 사용할 수 없다

  • default (friendly) : 같은 Package에서는 public 처럼 사용 가능하지만 다른 package에서는 상속받은 하위 Class 및 외부에서 사용할 수 없다

Overriding

부모 Class의 메소드를 자식 Class에서 재정의 (함수명, 매개변수, 리턴타입이 같아야 함)

final

final class FinalClass { // FinalClass는 상속이 불가
	public void Print() { ... }
}

class A {
	final void FinalMethod() { ... } // FinalMethod는 오버라이딩이 불가
}

class A {
	static final float finalVar = 3.14; // finalVar 수정이 불가
}
  • Class와 메소드의 맨 앞쪽에 위치하며, 상속과 오버라이딩이 불가

Constructor 호출 순서

  1. 상위 Class 생성자부터 하위 Class 생성자 호출
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 
  1. 생성자에 매개변수가 있는 경우 자동호출 불가 -> super 키워드 사용
  • super 키워드는 하위 Class에서 상위 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 ");
    }
}

Type Casting

  • 캐스트 연산자 ( ) 사용
  1. 하위 Class에서 상위 Class로 형 변환이 가능하며 접근지정자에 따라 접근이 결정
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 "); }
}
  1. 생성된 하위 Class에서 상위 Class 형 변환을 통해 하위 Class의 멤버에 접근 불가

  2. 상위 Class의 메소드가 하위 Class에서 오버라이딩된 경우 상위 Class 참조변수에서 오버라이딩된 메소드를 호출하면 하위 Class의 메소드가 실행

Abstract Class

  • 하위 Class에서 구현할 메소드의 원형을 가진 상위 Class
  • 상위 Class로만 존재하며 그 자체를 객체로 생성할 수 없음
abstract class 클래스명{
	일반 멤버 변수;
    메소드;
    생성자;
    abstract 반환형 메소드명(...);
}
  • extends 키워드를 이용하여 추상 Class 상속
  • 추상 메소드를 하위에서 모두 구현할 필요 없으며 다중 상속이 불가

Interface

  • Abastract Class와 동일하게 상위 Class로만 사용 가능하며, 하위 Class에서 구현할 함수의 원형을 선언
interface 인터페이스 명 {
	데이터형 변수명 =;
    리턴타입 메소드명 ( ... );
}
// Interface는 ~able로 명명하는 관례가 있다
// ex. Openable, Readable
class 클래스명 implements 인터페이스명{
}
  1. Abstract Class = 일반 멤버 + 추상 메소드 vs Interface = 추상 메소드 + 상수

  2. Interface는 하위 Class에서 모든 것을 구현해야 함 (강제성)

  3. 다중 상속 가능 (+ Interface가 Interface 다중 상속 가능)

interface A { ... }
interface B { ... }

interface C extends A, B { ... }
interface A { ... }
interface B { ... }
class C { ... }

class D extends C implements A, B { ... }

Inner Class

class 클래스명 {
	class 내부클래스명 {
    	...
    }
}
  • Class 내부에 Class를 정의한 것 (포함 구조)
  • 내부 Class는 외부 Class의 모든 자원 활용 가능 가능
  • 선언에 따라 인스턴스 내부 Class, 정적 내부 Class, 지역 내부 Class로 나눌 수 있음

Anonymous Class

클래스명 클래스변수 = new 클래스명() {
	멤버변수와 메소드 선언
};

인터페이스 인터페이스변수 = new 인터페이스명(){
	변수와 메소드 선언
};
  • 클래스명이 없는 Class
    일반 Inner Class => 컴파일 => 외부클래스명$내부클래스명.class
    Anonymous Class => 컴파일 => 외부클래스명$1.class
  • 선언과 생성이 동시에 이루어지는 일회성 Class

Exception Handling

  • 에러 : 수정할 수 없는 것 vs 오류 : 수정 가능, 알려주는 역할
try{
	예외가 발생할 수 있는 코드
} catch(Exception e){ // 관례적으로 e라고 많이 사용한다
	예외가 발생했을 때의 처리
} catch(Exception e){
	...
} ...
예외 클래스역할
ArithmeticException산술 연산 중 예외적인 상황(예: 0으로 나누기)이 발생했을 때 발생.
ArrayIndexOutOfBoundsException배열의 잘못된 인덱스에 접근하려 할 때 발생.
ClassCastException객체를 해당 클래스의 인스턴스가 아닌 클래스로 캐스팅하려 할 때 발생.
IllegalArgumentException메서드가 부적절하거나 허용되지 않는 인자를 받았을 때 발생.
IllegalStateException메서드가 부적절하거나 허용되지 않는 시점에서 호출되었을 때 발생.
IndexOutOfBoundsException배열, 리스트, 문자열 등에서 범위를 벗어난 인덱스에 접근하려 할 때 발생.
IOException입력/출력 작업이 실패하거나 중단되었을 때 발생.
NullPointerExceptionnull 참조를 통해 객체에 접근하려 할 때 발생.
NumberFormatException문자열을 숫자로 변환하려 했으나 올바른 형식이 아닐 때 발생.
SecurityException보안 관리자가 보안 위반을 감지했을 때 발생.
StringIndexOutOfBoundsException문자열에서 유효하지 않은 인덱스에 접근하려 할 때 발생.
UnsupportedOperationException지원되지 않는 작업을 수행하려 할 때 발생.
FileNotFoundException존재하지 않는 파일에 접근하려 할 때 발생.
InterruptedException스레드가 대기, 수면 중 인터럽트(중단)되었을 때 발생.
ClassNotFoundException애플리케이션이 클래스를 로드하려 했으나 해당 클래스를 찾을 수 없을 때 발생.
NoSuchElementException열거형(enumeration) 또는 리스트에서 존재하지 않는 요소를 요청했을 때 발생.
RuntimeException실행 중 발생할 수 있는 예외들의 부모 클래스 (Unchecked Exception).
Exception모든 Checked Exception의 부모 클래스.
Error복구 불가능한 심각한 오류들의 부모 클래스.

finally

try{
} catch (Exception e){
} finally {
	예외처리와 상관없이 항상 실행해야 하는 코드
}

throws

  • 모든 예외 처리를 try ~ catch 문을 통해 처리하기에는 어려움이 존재
  • 따라서 JVM 또는 예외 처리 Class를 지정한다
반환형 메소드() throws Exception { // Exception을 throw히면 JVM에서 처리
}

유용한 Class들

wrapper Class

Primitive Data TypeWrapper Class
charCharacter
byteByte
shortShort
longInteger
floatFloat
doubleDouble
booleanBoolean
  • 기본 데이터 타입을 객체로서 다룰 수 있도록 하는 class (기본 데이터 타입 + 메소드)

Integer Class

  • int형 primitive를 boxing하는 class
  • java.lang.Object -> java.lang.Number -> java.lang.Integer
  • parseInt, toString, valueOf 메소드의 경우 static (객체 생성 전에 사용 가능)

Autoboxing

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;
}
  1. wapper 객체와 값 사이의 변환을 자동으로 처리해주는 것
  2. 기존 wrapper Class의 메소드를 간략하게 사용할 수 있게 함

String Class

  • 고정 문자열
  • java.lang.Object -> java.lang.String, 63가지의 메소드 존재

StringBuffer Class

  • 유동 문자열
  • java.lang.Object -> java.lang.StringBuffer

Arrays Class

  • 배열을 다루는 Class, java.util.Arrays
  • 정렬, 검색, 특정한 값으로 설정, 비교, 문자열 반환 등의 기능
  • 주요 메소드는 전부 static 메소드

Collection Class

  • Collection = Container : 단일 구조 안에서 다수의 데이터를 그룹화하는 객체
  • 이러한 객체를 구현하는 것이 Collection Class

Collection Framework

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
  • 다수의 데이터를 다루기 위한 통합 구조 (기초 -> Collection Interface)

Generics

  • Collection Class에 저장할 타입을 지정
  • 데이터를 읽을 때 지정된 타입으로 데이터를 입력받게 하는 형식
컬렉션클래스 <type> 클래스변수
	= new 컬렉션클래스()
  • Collection Class로부터 데이터를 읽을 때 형변환 없이 읽을 수 있음
  • 데이터 형이 다를 경우 error 발생 (코드의 안정성 확보 가능)

Vector Class

  • 기존 배열의 단점을 보완하기 위한 Class
  • 유동적인 데이터 저장 (배열 + 매소드)
  • 기본형은 wrapper class로 변환하여 저장

ArrayList Class

  • Vector Class가 업그레이드 된 Class
  • 유동적인 데이터 저장 (배열 + 메소드)
  • 기본형은 그대로 사용 가능하지만 Generics 사용

LinkedList Class

  • 데이터의 추가, 삭제, 삽입이 자주 발생하는 데이터를 다루기 위한 자료구조 Class

0개의 댓글