새소식

Spring & Java/Java

3. 개념

  • -

1. 클래스(class)

 자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.

자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 됩니다.

 

 클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.

즉, 필드(field)란 클래스에 포함된 변수(variable)를 의미합니다. 또한, 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있습니다. 클래스는 생성된 객체의 필드를 초기화해주는 특별한 메소드인 생성자(constructor)

 

 

 

2. 생성자(constructor)

 클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성됩니다. 하지만 이렇게 생성된 객체는 모든 인스턴스 변수가 아직 초기화되지 않은 상태입니다. 따라서 자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공합니다.

 

 

 

3. 인스턴스(instance)

 자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체(object)를 선언해야 합니다. 이렇게 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스 화라고 합니다.

또한, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 합니다.

즉, 인스턴스란 메모리에 할당된 객체를 의미합니다.

 

 자바에서는 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있습니다. 이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있습니다. 하지만 해당 클래스의 모든 메소드(method)는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 됩니다.

 

 

 

4. String & StringBuffer & StringBuilder Difference

 

 

1) String

 

 먼저 String과 다른 클래스(StringBuffer, StringBuilder)의 차이점은 두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변), StringBuffer는 mutable(변함)에 있습니다.

 

String은 문자열을 대표하는 것으로 문자열을 조작하는 경우 유용하게 사용할 수 있습니다. 문자열, 숫자, char 등은 concat할때는 StringBuffer, StringBuilder를 사용할 수 있습니다. 단, 복잡한 경우 의미가 있고, 단순한 경우에는 굳이 StringBuffer, StringBuilder를 쓰지 않고 +연산자를 활용해 직접 합지면 됩니다.

 

String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않습니다. + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라,


새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 그 객체를 참조하도록 합니다. (즉, String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성. 한번 생성된 객체의 내부 내용을 변화시킬 수 없습니다. 기존 객체가 제거되면 Java의 가비지 컬렉션이 회수합니다.)

 

String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않습니다.


하지만, Immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe),  내부 데이터를 자유롭게 공유 가능합니다.

 

2) StringBuffer와 StringBuilder

그럼 StringBuffer와 StringBuilder 클래스를 한번 볼까요?


StringBuffer/StringBuilder는 String과 다르게 동작합니다.

문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우,


기존의 버퍼 크기를 늘리며 유연하게 동작합니다. StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일합니다.

 

그럼 두 클래스의 차이점은 무엇일까요? 바로 동기화 여부입니다.

- StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.
- 반면, StringBuilder는 동기화를 보장하지 않음.

 

그렇기때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,


단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋습니다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않습니다.

 

String은 짧은 문자열을 더할 경우 사용합니다.

StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.

StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다.

 

 사실 JDK 1.5버전 이전에서는 문자열연산(+, concat)을 할때에는 조합된 문자열을 새로운 메모리에 할당하여 참조함으로 인해서 성능상의 이슈가 있었습니다. 그러나 JDK1.5 버전 이후에는 컴파일 단계에서 String 객체를 사용하더라도 StringBuilder로 컴파일 되도록 변경되었습니다. 그리하여 JDK 1.5 이후 버전에서는 String 클래스를 활용해도 StringBuilder와 성능상으로 차이가 없어졌습니다. 하지만 반복 루프를 사용해서 문자열을 더할 때에는 객체를 계속 추가한다는 사실에는 변함이 없습니다. 그러므로 String 클래스를 쓰는 대신, 스레드와 관련이 있으면 StringBuffer를, 스레드 안전 여부와 상관이 없으면 StringBuilder를 사용하는 것을 권장합니다.

 

단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String 입니다.

https://12bme.tistory.com/42

 

[자바] String, StringBuilder, StringBuffer의 차이

* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자열을 저

12bme.tistory.com

 

 

5. 자바 컴파일 과정

  1. 컴파일러가 변환: 소스코드 -> 자바 바이트 코드(.class)
  2. JVM이 변환: 바이트코드 -> 기계어
  3. 인터프리터 방식으로 애플리케이션 실행

 

 

6. JVM구조의 이해

메소드, 힙, 스택, pc 레지스터, 네이티브 영역으로 구분

  1. 메소드 영역은 클래스가 로딩될 때 생성되며 주로 static변수가 저장
  2. heap영역은 런타임시 할당되며 주로 객체가 저장
  3. 스택영역은 컴파일시 할당되며 메소드 호출시 지역변수가 저장
  4. pc레지스터는 스레드가 생성될 때마다 생성되는 영역으로 다음 명령어의 주소를 알고 있다
  5. 네이티브 영역은 자바 외 언어로 작성된 코드를 위한 영역이다.

 힙과 스택은 같은 메모리 공간을 동적으로 공유하며, 과도하게 사용하는 경우 OOM이 발생할 수 있다.(OOM -> out of memory)

힙 영역은 GC를 통해 정리된다.

 

(1) Method Area(Class Area)

- 클래스가 로딩될 때 생성

- 클래스, 변수, 메소드 정보

- static 변수

Constant pool -> 문자 상수, 타입, 필드, 객체 참조가 저장됨

 

(2) Stack Area

- 컴파일 타임시 할당

- 메소드를 호출할 때 개별적으로 스택이 생성되며 종료시 해제

- 지역 변수 등 임시값이 생성되는 영역

- Heap영역에 생성되는 객체의 주소 값을 가지고 있다.

 

(3) Heap Area

- 런타임시 할당

- new 키워드로 생성되는 객체와 배열이 저장되는 영역

- 참조하는 변수가 없어도 바로 지워지지 않고 -> GC를 통해 제거됨

 

Java: GC, 컴파일/런타임차이

자바에는 프로세스가 존재하지 않고 스레드만 존재하며 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다

 

 

 

7. Overloading & Overriding Difference

 Overloading : 메서드 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미 리턴값만을 다르게 갖는 오버로딩은 작성 할 수 없다. 기존에 없던 새로운 메서드를 정의하는 것이다.(단 메서드 명만 같으면 된다.)

 

 Overriding : 상위 클래스의 메서드를 하위 클래스가 재정의 하는것이다. 메서드의 이름은 물론 파라미터의 갯수나 타입도 동일해야 하며 , 주로 상위 클래스의 동작을 상속받은 하위 클래스에서 변경하기 위해 사용된다. 간략하게 상속 받은 메서드의 내용만 변경해야 하는 것이다.

 

 오버로딩은 생성자가 여러개 필요한 경우 유용하다. 결합도를 낮추기 위한 방법 중 하나로 interface사용이 있으며 이 과정에서 오버라이딩이 적극 사용된다.

 

 

 

8. ArrayList & LinkedList Difference

 배열은 인덱스를 가짐. 원하는 데이터를 한번에 접근하기 때문에 접근 속도 빠름.

크기 변경이 불가능하며, 데이터 삽입 및 삭제 시 그 위치의 다음 위치부터 모든 데이터 위치를 변경해야 되는 단점 존재

 

 연결리스트는 인덱스 대신에 현재 위치의 이전/다음 위치를 기억함.

크기는 가변적. 인덱스 접근이 아니기 때문에 연결되어 있는 링크를 쭉 따라가야 접근이 가능함. (따라서 배열보다 속도 느림)

데이터 삽입 및 삭제는 논리적 주소만 바꿔주면 되기 때문에 매우 용이함

  • 데이터의 양이 많고 삽입/삭제가 없음. 데이터 검색을 많이 해야할 때 → Array
  • 데이터의 양이 적고 삽입/삭제 빈번함 → LinkedList

 

참고 : http://www.tcpschool.com/java/java_class_declaration

'Spring & Java > Java' 카테고리의 다른 글

5. JVM  (0) 2023.11.23
1. 핵심원리 기본편  (0) 2022.08.02
3. 스프링 웹 개발 기초  (0) 2022.07.14
2. Java (TDD, GCC)  (0) 2022.07.14
1. 객체지향 Java  (0) 2022.07.14
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.