Study/[Panda] 자료구조 스터디

[Panda] 02. 자바 기초

orieasy1 2024. 7. 26. 11:57

01. 클래스

자바에서 가장 중요한 용어 중 하나가 클래스이다.

클래스는 객체를 만드는 수단이고 객체 지향 언어인 자바는 모든 것이 클래스를 중심으로 구성된다.

클래스는 어떤 대상을 추상화하는 의미 단위이기도 하다.

 

메서드 중에 클래스이름과 동일한 메서드를 생성자라한다.

생성자는 해당 클래스의 객체가 하나 만들어질 때 자동으로 수행되어 객체를 초기화하는 역할을 한다.

클래스의 필드나 메서드를 선언할 때는 public, private 같은 접근 지정자로 공개범위를 정해주어야한다.

객체 지향의 핵심 철학 중 하나가 불필요한 외부 노출은 지양하는 것이므로 접근 지정자를 이요해 필요한 만큼만 클래스 바깥으로 공개하는 것이 좋다.

 

메서드 중 main() 메서드는 프로그램의 수행을 시작하는 메서드로 제일 먼저 실행된다. 이 main() 메서드는 반드시 어떤 클래스 안에서 정의되어야 한다.

main() 메서드는 클래스안에 존재할수도 있고 없을 수도 있는데, 없는 경우 이런 클래슨느 다른 클래스에서 사용하기 위해 존재한다. main() 메서드가 있는 클래스는 스스로 수행을 시작할 수도 있고 다른 클래스에섣도 사용될 수 있다.

일정 규모 이상의 프로젝트는 대개 시작전용 클래스를 만들어 그곳에서 main() 메서드를 수행한다.

 

 

02. 인터페이스

자바에서 클래스를 추상적으로 묘사하는 대표적인 수단 두 가지는 interface와 abstract이다.

abstract는 클래스나 메서드를 선언할 때 접두어로 붙일 수 있다.

해당 클래스나 메서드의 뼈대만 묘사해놓고 완성하지 않았다가 다른 클래스가 해당 클래스를 상속받아 완성하는 방식이다. 이 방식은 큰 프로젝트에서 가끔 쓰일 수 있다.

반면 interface는 전체를 추상적으로 묘사하는 방식으로 추상 데이터 타입과도 잘 맞다.

인터페이스의 경우 한 클래스로부터만 상속받을 수 있는 상속과 달리 둘 이상의 인터페이스를 따를 수 있다.

 

기초타입 외의 클래스간 대소관계를 비교하기 위해서 Comparable이라는 인터페이스 타입을 제공한다.

if(a.compareTo(b) < 0)는 if( a < b)를 수행하는 효과를 낸다.

Comparable 이외에도 String, TEar, LocalTime, Timestamp 등 여러 기능을 제공하는 인터페이스가 존재한다.

인터페이스를 변수 타입으로도 사용할 수 있다.

 

 

03. 제네릭

자바 제네릭은 자바에서 데이터 타입을 일반화하는 방법이다.
제네릭을 사용하면 컬렉션, 메서드 클래스 등에서 사용하는 데이터 타입을 컴파일 시점이 아니라 런타임 시에 결정할 수 있다.
자바에서 API를 만들 때 <>안에 String을 담을지, Book을 담을지, Member를 담을지 등등을 당장 정할 수 는 없을 것이다 (모르니까). 이 때 <> 제네릭 기호를 사용하여 안에 어떤 배열을 가질 것인지 그 타입을 적어주면 런타임 시(실행 시) 그 타입이 결정된다.
이런 것들은 컬랙션 프레임워크를 사용할 때 안정성을 올려주는 역할을 한다.
제네릭 타입은 선언할 때 어떤 데이터 타입이 들어올지 결정하지 않으므로 다양한 데이터 타입에 대해 일번적으로 적용할수 있는 메서드나 클래스를 작성할 수 있다. 코드의 재사용성을 높여주는 것이다.

 

 

04. 패키지

클래스와 인터페이스들을 모아놓은 것을 패키지라 한다. 패키지 안에 다른 패키지(서브 패키지)가 포함되는 계층적 구조를 가질 수도 있다.

패키지를 모아놓은 것이 프로젝트다. 프로젝트의 이름은 *.jar과 같이 jar 확장자로 끝난다.

의상 그룹 지어지는 코드들ㅇ르 패키지로 묶으면 편리하다.

 

java.lang이 대표적인 패키지 예다. java.lang에는 다음과 같은 클래스들이 포함되어있다.

  • Object 클래스
  • String 클래스
  • Wrapper 클래스
  • Stream 클래스

 

 

05. 프로그램 수행

main() 메서드와 에러 처리 구조

main() 메서드는 프로그램 수행의 시작점이다.

>> java heap

이라고 명령어를 입력하면 우리 컴퓨터는 Heap.java 파일로 가서 클래스 Heap을 찾은 다음 그 안의 여러 메서드 중 main()을 찾아 프로그램을 시작한다. IDE에서 run을 클릭했을 때도 같은 작업이 일어난다.

 

코딩을 하다보면 여러 종류의 에러가 생긴다.

어떤 지점에서 발생할 수 있는 에러에 대해 장치를 해놓으면 디버깅 시간을 절약할 수 있다.

보통 이를 위해 try-catch 구조가 많이 사용된다. try안에 수행할 코드를 넣고 수행할 동안 특정 에러가 나면 수행을 중단하고 catch로 넘어가는 것이다.

try-catch를 더 세분화할 수도 있고 문장마다 해당되는 에러 객체를 따로 설정할 수도 있다. 또 던질 에러의 이름도 Exception의 하위 클래스로 다양하게 만들 수 있다.

try-catch 구조에 catch가 끝난 후 마지막 처리르 명시해 try-catch-finally 구조를 만들 수도 있다.

 

모든 고급 프로그램은 컴파일 시점에 메모리의 어느 위치에서 수행도리지 알 수 없다. 그래서 일단 0번지에서 시작하는 가상 메모리를 가정하고 컴파일한 다음 수행시 메모리의 실제 주소에 바인딩된다.

자바에서는 JVM이 가상 공간에서 프로그램을 수행시키기 위해 메모리를 기능에 따라 나누고 그 위에서 프로그램을 수행시키는 역할을 한다.

정적 공간: 프로그램 코드와 전역 변수, 정적 변수가 저장되는 곳

전역변수와 정적 변수는 프로그램이 끝날 때 까지 없어지지 않는다. 정적공간은 컴파일이 끝나면 수행되기 전에 이미 주인이 결정된다. 끝날 때까지 보관해야하는 대상들이 저장되는 공간을 정적 메모리라고 한다.

 

스택 영역

함수는 한시적으로 호출되므로 수행이 끝나면 공간을 잡고 있을 필요가 없다.

따라서 스택 자료구조를 이요해서 공간을 할당한 다음 호출되어 살아있는 함수를 순서대로 쌓는다.

main() 메서드는 예외로 정적 메모리에 자리를 잡아두고 시작한다. 이후 main()에서 호출된 메서드들은 스택영역이 위로 쌓이며 수행하다가 수행이 끄탄면 스택에서 지워진다.

 

힙 영역

수행 중에 생성된 배열이나 객체가 저장된다.

가비지 컬렉터가 청소하는 대상이 되는 공간이다. 가비지 컬렉션은 할당 받았다가 더 이상 쓰지않는 메모리 공간을 회수하는 것을 뜻한다.

'Study > [Panda] 자료구조 스터디' 카테고리의 다른 글

05. 큐란?  (0) 2024.09.24
[Panda] 03. List 리스트  (0) 2024.08.02
[Panda] 01. 자료구조와 시간복잡도  (0) 2024.07.26