목차
- Java의 특징
- Java, C++ 공통점, 차이점
- Java 메모리 구조-Stack/Heap 차이
- Garbage Collector(GC)란?
- Java 자료형 - Primitive/Reference Type
- Class(클래스)와 Structure(구조체)의 차이
- Overloading과 Overriding의 차이
1. Java의 특징
1-1. 객체지향
객체지향이란? 현실세계를 모티브로 함.
객체란, 현실세계에 존재하는 모든 것들. 속성(data)와 행위(method)로 구성된다.
생성될 때(new)기본값으로 초기화 된다.
객체지향의 특징
더 자세한 내용은
-
Abstraction(추상화)
: 현상에 존재하는 객체의 주요 특징을 추출하는 과정.
-
Encapsulation(캡슐화)
: 하나의 클래스 안에 데이터, 기능을 담아 정의하고(속성), 중요한 데이터나 복잡한 기능 등은 숨기고(private/protected), 외부에서 사용에 필요한 기능만을 공개하는 것.
-
Inheritance(상속)
: 객체 정의 시 기존에 존재하는 객체의 속성과 기능을 상속받아 정의 하는 것.
특정 Class를 상속 받아 그 Class의 변수와 기능을 재사용한다. Java에서는 다중상속이 불가능하다.
sub객체 생성 시 super도 함께 생성된다.
- Generalization : 추출된 class의 공통적인 특성을 모아 super class로 정의.
- Specialization : 비슷한 속성과 기능을 가지고 있는 다른 class를 상속받아 새로운 class를 정의할 수 있음.
-
Polymorphism(다형성)
: 상속이 전제가 되어야 한다. 같은 타입 또는 같은 기능의 호출로 다양한 효과를 가져오는 것.
: 같은 타입의 변수가 다양한 형태의 객체를 참조하는 것.
즉, super타입의 변수가 다양한 sub타입을 참조하는 것을 의미한다.
Member mem = new Member(); Member memc = new MainMember();
-
장점
super 클래스와 sub클래스를 다형성에 의해 super 클래스 타입으로 한꺼번에 관리 및 저장 가능.
-
1-2. 플랫폼 독립적이다.
JVM(Java Virtual Machine) 위에서 동작하므로 컴파일 시 코드를 JVM이 번역한다. 따라서 OS에 상관없이 어떠한 환경에서도 동작할 수 있다.
1-3. 간단하다.
C, C++의 복잡한 점, 메모리 관리의 어려움을 해결하여 쉽게 접근 가능하도록 설계되어 있다.
1-4. 분산 프로그래밍 지원
1-5. 멀티 스레드
Thread API를 제공하여 운영체제에 종속적이지 않은 독립적 설계와 JVM에 의해 스케줄링이 되도록 구현되어있다.
2. Java, C++ 차이점
공통점
자바와 C++은 문법적으로 상당히 유사하다. 애초에 자바를 설계할 때 C++ 개발자들이 쉽게 배울 수 있도록 설계했기 때문이다.
차이점
-
설계 목표 관점
설계 시 자바는 보안, 이식성, 빠른 개발에 비중을 두었고 C++은 C언어와의 하위 호환성에 중점을 두었다. 따라서 C++은 C에서 사용하는 포인터, 전처리기 같은 기능을 모두 이용할 수 있다.
-
컴파일
자바는 JVM이라는 가상 머신 위에서 동작하며, 가상 머신 바이트 코드로 컴파일 되면 각 운영체제에 맞는 JVM을 통해 실행할 수 있다. 반면에 C++은 각 OS에 맞는 기계어로 컴파일된다. 따라서 일반적으로 C++이 자바보다 빠르다.
-
상속
C++은 다중상속이 가능하지만 자바는 다중상속이 불가능하다. 다중상속을 지원하는 경우 다이아몬드 문제가 발생할 수 있다. 이를 방지하기 위해 자바에서는 애초에 다중상속을 막아버렸다. 단 자바에서도 인터페이스는 다중상속이 가능하다.
-
메모리
자바는 객체를 Heap영역에만 할당할 수 있으나, C++은 Heap과 Stack 모두에 할당이 가능하다. 메모리 관리의 경우에도 자바는 개발자가 직접 메모리를 해제할 수 있으나 Java는 Garbage Collection을 이용해 자동으로 불필요한 메모리를 해제한다.
3. Java 메모리 구조-Stack/Heap
메모리 구조
-
Class Area(=Method Area) : 메모리로 읽어온 클래스의 정보를 기억한다.
-
heap : 클래스의 객체를 생성하여 기억한다.
-
stack : 메소드 수행 시마다 프레임이 할당되어 메서드 수행에 필요한 변수나(로컬변수), 중간 결과 값을 임시 기억한다. 메소드가 종료될 경우 할당된 메모리가 자동 제거된다.
4. Garbage Collector(GC)란?
자바는 메모리 관리를 개발자가 아닌 GC(Garbage Collector)라는 쓰레드를 생성하여 사용하지 않는 객체들을 제거한다.
일반적으로 자바에서는 JVM에 의해 자동으로 Garbage Collection이 실행된다. 더 이상 사용되지 않은 객체들을 점검하여 제거한다.
GC(Garbage Collection)
-
Heap영역(class 영역 포함)에 생성된 객체들의 메모리 관리를 담당하는 프로그램.
-
더 이상 사용되지 않은 객체들을 점검하여 제거한다.
-
JVM에 의해 자동적으로 실행되며, CPU가 한가하거나 메모리가 부족할 때 실행된다.
-
GC를 수행하는 동안 GC를 수행하기 위한 Thread 이외의 모든 Thread 작업이 멈추기 때문에 시스템에 큰 영향을 미치게 된다.
Young Generation
- 객체 사용 시간이 짧은 객체들이 위치한다.
-
Eden과 Survivor0(S0), Survivor1(S1) 으로 구성된다.
- 새롭게 생성된 객체는 Eden에서 생성된다. 이 영역에서 객체가 사라질 경우 Minor GC가 발생했다고 한다.
Old Generation
- Young 영역에서 살아남은 객체가 여기로 복사된다.
- Young 영역보다 메모리는 크게 할당되며 GC가 적게 발생된다.
Permenant Generation(Non-heap)
- JVM에 의해 사용하는 클래스와 메소드 객체 정보를 담고 있다.
-
Garbage Collection 타입
Minor GC Major GC Full GC 대상 Young Generation Old Generation 전체 Heap + Meta Space
(Permanent 영역)트리거 되는 시점 Eden이 full일 경우 Minor GC가 실패할 때 Minor/Major GC가 실패할 때
5. Java 자료형 - Primitive/Reference Type
5-1. Primitive Data Type
-
기본적인 값을 기억하는 변수 타입.
-
byte, short, int, float, double, char, boolean
Implicit Type Casting(암시적 형 변환)
: 작은 크기의 타입은 큰 크기의 타입으로 자동 형 변환 된다.
Explicit Type Casting(명시적 형 변환)
: 큰 크기의 타입을 작은 크기의 타입으로 변경할 경우
int intNum = (int)doubleNum;
5-2. Reference Data Type
-
객체의 참조값을 기억하는 변수.
-
class, interface, 배열
1) 1차원 배열
- 배열 선언, 생성, 값 할당
- 자바는 배열 선언 시 크기를 지정해주지 않아도 된다.
- 자바에서는 배열의 마지막에 배열의 크기값이 저장된다. 따라서 arr.length를 이용해 배열 크기를 사용할 수 있음.
※ arr.length()가 아님을 주의!!
int[] arr = {10, 20, 30, 40}; //선언과 생성, 값 할당을 동시에
int[] arr1 = new [5]; //선언과 생성을 동시에
int[] arr2;
arrw = new int[3]; //배열의 크기를 선언 이후 지정해주어도 된다.
int arr2[]; //c에서와 마찬가지로 변수명 뒤에 []를 붙여도 된다.
2) 다차원 배열
- 배열의 배열로 저장됨. 행의 크기는 필수이나 각 열의 크기는 서로 달라도 됨.
- 자바에서는 다차원 배열이 참조 형식으로 되어있기 때문에 열의 크기가 고정되지 않아도 된다.(즉, 행의크기만 선언해도 됨
int[][] arr = new int[5][]; //열의 크기가 확실하지 않을 때
//열의 크기가 각자 달라도 된다.
int[][] brr = {{10, 20, 30, 40, 50}
,{20, 30}
,{20, 30, 40, 50}};
6. Class(클래스)와 Structure(구조체)의 차이
6-1. Class(클래스)
어떤 특정 종류의 모든 객체들에 대해 일반적으로 적용할 수 있는 변수와 메소드를 정의하고 있는 설계도이다.
6-2. Structure(구조체)
연관성이 있는 서로 다른 자료형을 하나의 집합으로 묶어 새롭게 정의한 사용자 정의 자료형이다.
차이점
클래스 | 구조체 |
---|---|
참조 형식 Heap할당 사용 상속가능 생성자 필요 메소드 포함 |
값 형식 스택할당 사용 상속 불가능 생성자 X 메소드 없음 |
7. Overloading과 Overriding의 공통점, 차이점
- 공통점
- method 정의 시 이름을 같게 정의한다.
- 사용이 편리하다.
- 다형성 효과
-
Overriding(메소드 재정의)
super class의 메소드를 sub class에서 재정의해서 사용하는 것.
- 상속이 전제가 되어야 한다.
- 상속 받은 메소드와 전체적인 기능은 동일하지만 상세 구현이 조금 다를 경우 기존의 상속 받은 메소드로 사용할 수 없으므로 새로운 메소드를 추가로 선언해야 한다.
규칙
-
메소드명, 인자, 리턴타입을 동일하게 선언한다.
-
access modifier(접근 제한자)
부모와 같거나 보다 넓은 범위로 정의해야 한다.
-
예외 던지기
부모 메소드와 같은 예외를 던지거나 예외를 안던진다.
-
리턴 타입
1.7 버전 : 상속 받은 메서드와 리턴 타입이 반드시 같아야 한다.
1.8 버전 : 상속 받은 메서드와 리턴 타입이 같거나 sub를 리턴한다.
부모 ----------------- public Customer getCustomer() 자식에서 override ----- public Customer getCustomer() //리턴타입이 super와 같음. ----- public MainCustomer getCustomer() //리턴타입이 sub
효과
- 상속받은 메소드와 이름, 인자가 같으므로 메소드 호출 방법이 기존의 코드와 동일하고 리턴 타입이 동일하므로 호출 후 처리 방법이 기존의 코드와 동일하므로 기존의 코드를 수정하지 않고 변경된 내용을 반영할 수 있다.
- 부모 객체인지 자식 객체인지 구별하지 않고 기능이 같으면 동일한 이름으로 메소드를 호출해서 사용한다. => 메소드 호출에 대한 편리성 제공
-
Overloading
한클래스 내에, 메소드명이 같은 메소드들을 여러개 정의 하는 것. (즉, 메소드의 인자를 다르게 전달받고 싶을 경우 메소드의 이름을 같게 하고 파라미터 타입을 다르게 해서 사용하는 것.)
- 상속이 아니어도 사용이 가능하다. 단, 인자가 달라야 함.
- 같은 기능을 하는 메소드를 다양한 타입의 인자로 사용하고 싶을 경우.
- 자바의 대표적인 overloading 함수는 println이 있다.(이클립스에서 ctrl+space bar를 이용해서 확인.)
==+ 클래스 내의 메인 메소드도 오버로드 할 수 있다.==
규칙
- 파라미터의 개수를 다르게 선언.
-
파라미터의 타입을 다르게 선언.
private static void sum(int a, int b){
System.out.println("a+b = ", a+b);
}
private static void sum(int a, int b, int c){ //파라미터의 개수를 다르게 선언.
System.out.println("a+b+c = ", a+b+c);
}
private static void sum(double a, double b){ //파라미터의 타입을 다르게 선언.
System.out.println("a+b = ", a+b);
}