Programming/Java

Java - 기본 개념

kevin_01 2023. 2. 20. 15:45
728x90

1. 자바 생성자의 특징

모든 클래스는 인스턴스화 될때 생성자를 사용한다.

생성자의 특징

  • 생성자는 리턴타입이 없다.
  • 생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일할 때 자동으로 만들어진다.
  • 매개변수가 없는 생성자를 기본생성자라고 한다.
  • 생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 자동으로 만들어진다.

생성자의 역할

  • 생성자가 하는 일은 객체가 될 때 필드를 초기화 하는 역할을 수행한다.
  • 자동차가 객체가 될때 반드시 이름을 가지도록 하려면, Car클래스를 다음과 같이 만들어야 한다.
public class Car{
        String name;
        int number;

        public Car(String n){
            name = n;
        }
    }
  • 위의 Car 클래스 이용하여 Car 인스턴스를 생성하는 방법
    public class CarExam2{
        public static void main(String args[]){

            Car c1 = new Car("소방차");
            Car c2 = new Car("구급차");
            //Car c3 = new Car(); // 컴파일 오류가 발생합니다.

            System.out.println(c1.name);

            System.out.println(c2.name);
        }
    }
  • Car클래스는 기본 생성자를 가지지 않는다. 그래서 기본생성자로 Car 객체를 생성할 수 없다.

 

2. 클래스 변수와 인스턴스 변수의 차이

인스턴스 변수(Instance Variable)

  • 클래스 영역에 선언
  • 클래스 인스턴스를 '생성할 때' 만들어짐
  • 인스턴스는 독립적인 저장공간을 가져 서로 다른 값을 가질 수 없음

클래스 변수(Class Variable)

  • 클래스 영역에 선언하는데 인스턴스 변수 앞에 static을 붙이면 됨
  • 모든 인스턴스가 공통된 저장공간을 공유하게 됨
  • 인스턴스변수와 달리 인스턴스를 생성하지 않고도 사용이 가능함

지역변수(Local Variable)

  • 메서드 내에 선언되며 해당 메서드 내에서만 사용이 가능
  • 메서드가 종료되면 소멸되어 사용 불가
  • for, while문의 블럭{ } 내에 선언된 지역변수는 블럭을 벗어나면 사용이 불가

 

3. 동일성과 동등성의 차이

동일성

  • 동일성은 동일하다는 뜻으로 두 개의 객체가 완전히 같은 경우를 의미한다. 여기서 완전히 같다는 뜻은 두 객체가 사실상 하나의 객체로 봐도 무방하며, 주소 값이 같기 때문에 두 변수가 같은 객체를 가리키게 된다.
  • 위 예제에서 refVar1은 객체1을 가리키고 있고, refVar2와 refVar3는 객체2를 가리키고 있다. refvar2와 refVar3는 동일한 객체를 가리키고 있으므로, 두 변수는 동일하다고 이야기할 수 있다. 그리고 해당 변수가 동일한지 == 연산자를 통해 판별할 수 있다.

  • 참고로 Primitive 타입은 객체가 아니라 주소가 없으므로 == 연산자를 사용하였을 때 내용이 같으면 동일하다고 말한다.

동등성

  • 동등성 동등하다는 뜻으로 두 개의 객체가 같은 정보를 갖고 있는 경우를 의미한다. 동등성은 변수가 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 동등하다고 이야기할 수 있다. 동일하다면 동등하지만, 동등하다고 동일한 것은 아니다. 
  • 그리고 해당 변수가 동등한지 equals연산자를 통해 판별할 수 있다.
String str1 = new String("aaa");
String str2 = new String("aaa");

System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
  • new 키워드를 통해 다른 String 객체를 메모리에 할당하였으므로 str1과 str2가 가리키는 객체의 주소 값은 다르므로 동일하지 않다. 하지만 String이 재정의한 equals() 연산자에 의해 두 객체의 내용이 같으므로 동등하다고 할 수 있다.

 

4. 메서드 오버로딩과 오버라이딩의 차이 및 오버라이딩의 차이점

오버로딩(Overloading) : 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

  • 메서드 오버로딩, 생성자 오버로딩이 있다. (둘 다 같은 개념)
  • 같은 이름의 함수(메서드)를 여러개 정의하고, 매개 변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게 된다,
class OverloadingTest{
    //이름이 cat인 메서드
    void cat(){
        System.out.println("매개변수 없음");
    }
    
    //매개변수 int형이 2개인 cat 메서드
    void cat(int a, int b){
        System.out.println("매개변수 :"+a+", "+b);
    }
    
    //매개변수 String형이 한 개인 cat 메서드
    void cat(String c){
        System.out.println("매개변수 : "+ c);
    }
    
}
 
public class OverTest {
 
    public static void main(String[] args) {
        
        //OverloadingTest 객체 생성
        OverloadingTest ot = new OverloadingTest();
        
        //매개변수가 없는 cat() 호출
        ot.cat();
        
        //매개변수가 int형 두개인 cat() 호출
        ot.cat(20, 80);
        
        //매개변수가 String 한개인 cat() 호출
        ot.cat("오버로딩 예제입니다.");
        
    }
 
}

오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용

  • 상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메서드도 하위 클래스로 상속 되어 하위 클래스에 사용할 수 있다.
  • 또한 하위 클래스에서 메서드를 재정의해서도 사용할 수 있다.
  • 쉽게 말해, 메서드의 이름이 서로 같고, 매개변수가 같고, 반환형이 같을 경우에 상속받은 메서드를 덮어쓴다고 생각하면된다.
  • 부모클래스의 메서드는 무시하고, 자식 클래스의 메서드 기능을 사용하는 것과 같다.
class Woman{ //부모클래스
    public String name;
    public int age;
    
    //info 메서드
    public void info(){
        System.out.println("여자의 이름은 "+name+", 나이는 "+age+"살입니다.");
    }
    
}
 
class Job extends Woman{ //Woman클래스(부모클래스)를 상속받음 : 
 
    String job;
    
    public void info() {//부모(Woman)클래스에 있는 info()메서드를 재정의
        super.info();
        System.out.println("여자의 직업은 "+job+"입니다.");
    }
}
 
public class OverTest {
 
    public static void main(String[] args) {
        
        //Job 객체 생성
        Job job = new Job();
        
        //변수 설정
        job.name = "유리";
        job.age = 30;
        job.job = "프로그래머";
        
        //호출
        job.info();
        
    }
 
}

 

5. 자바 Collection (Set, List, Map)

Java에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미한다

  • JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.
  • Collection 인터페이서는 List, Set, Queue로 크게 3가지 상위 인터페이스로 분류할 수 있다.
  • Map의 경우 Collection 인터페이스를 상속 받고 있지 않지만 Collection으로 분류한다.

1. Set  인터페이스

순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.

  • HashSet
    • 가장빠른 임의 접근 속도
    • 순서를 예측할 수 없음
  • TreeSet
    • 정렬방법을 지정할 수 있음

2. List 인터페이스

순서가 있는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.

  • LinkedList
    • 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
    • 스택, 큐, 양뱡향 큐 등을 만들기 위한 용도로 쓰임
  • Vector
    • 과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘쓰이지 않음
  • ArrayList
    • 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남

3. Map 인터페이스

키(Key),  값(Value)의 쌍으로 이루어진 데이터의 집합으로, 순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나  값(Value)의 중복은 허용한다.

  • Hashtable
    • HashMap보다는 느리지만 동기화 지원
    • null 불가
  • HashMap
    • 중복과 순서가 허용되지 않으며 null값이 올 수 있다.
  • TreeMap
    • 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름

 

6. 추상 클래스와 인터페이스의 공통/차이점 및 어떤 기준으로 추상클래스/인터페이스를 사용 하는지

추상 클래스와 인터페이스 공통점

  • 둘 다 자기 자신이 new를 통해 객체를 생성할 수 없고, 오로지 자식만이 객체를 생성할 수 있다.
  • 둘 다 추상 메서드를(abstract method)를 갖는다.
  • 둘 다 하위 클래스에서 추상 클래스를 모두 구현해야 한다.

추상 클래스 → 객체들의 공통 특성들을 모아놓은 클래스

인터페이스 → 객체 생성을 위한 설계도

 

추상 클래스(Abstract Class) 인터페이스(Interface)
상속하여 공통된 기능을 만들고, 확장하기 위함 구현하는 객체들이 같은 동작을 보장하기 위함
다중상속 불가능 다중상속 가능
생성자와 일반변수 모두 가질 수 있다. 생성자와 일반변수를 가질 수 없다.
메서드를 부분적으로 구현할 수 있다. 메서드 선언만 가능하다.
extends 키워드를 사용한다. implements 키워드를 사용한다

추상클래스와 인터페이스는 사용목적이 다르다.

  • 추상 클래스 → 복제
  • 인터페이스  설계

추상 클래스

  • 공통점을 뽑아놓은 클래스
  • 여러 자식들이 가지고 있는 공통된 속성들을 뽑아서 하나의 클래스를 만들어 놓은 것을 뜻한다.
  • 상속의 의미는 is a kind of(~의 한 종류)라는 의미
  • 추상 클래스는 엄연한 객체, 비록 단독으로 생성하지는 못하지만 객체이기에 생성자도 사용할 수 있다.
  • 많은 객체를 생성해야 할 때 각각의 겍체의 공통점과 개발의 효율성을 위해 성성

 

인터페이스

  • 객체가 아니라 추상 자료형
  • 객체가 아니기에 생성자도 사용하지 못함
  • 오로지 상수와 추상 메서드만 가질 수 있고 이것을 다른 객체가 구현(implements : 구현하다)
  • 구현의 의미는 be able to(~할 수 있는)이라는 의미를 가진다.
  • 수많은 개발자가 함께 협업을 할 때 객체 간의 통일성을 강제하기 위한 용도로 많이 사용

 

7. 가비지 컬렉션

가비지 컬렉션(Garbeage Collection, GC) : 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스

 

장점

  • JVM에 탑재되어 있는 가비지 컬렉터가 메모리 관리를 대행해준다.
  • 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에서 대해 완벽하게 관리하지 않아도 되어 오롯이 개발에만 집중 할 수 있다.

 

단점

  • 개발자가 메모리가 언제 해제되는지 정확하게 알 수 없다.
  • 가비지 컬렉션(GC)이 동작하지 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.

 

Mark And Sweep 알고리즘

가비지 컬렉션이 동작하는 원리로 루트에서부터 해당 객체에 접근 가능한지에 대한 여부를 메모리 해제의 기준으로 삼는다.

  • Mark 과정 : 먼저 Root로부터 그래프 순회를 통해 연결된 객체들을 찾아 내어 각각 어떤 객체를 참조하고 있는지 찾아서 마팅합니다.
  • Sweep 과정 : 참조하고 있지 않은 객체 즉 Unreachable 객체들을 Heap에서 제거합니다.
  • Compact 과정 : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축합니다.(가비지 컬렉터 종류에 따라 하지 않은 경우도 있음)

GC의 대상이 되는 Heap 영역

Heap Area는 효율적인 GC를 위해 위와 같이 Eden, Survival, Old Generation 으로 나뉜다.

728x90

'Programming > Java' 카테고리의 다른 글

백준 15686 : 치킨 배달 [JAVA]  (0) 2023.04.03
백준 16236 : 아기 상어 [JAVA]  (0) 2023.04.03
백준 1753 : 최단 거리 [JAVA]  (0) 2023.03.28
백준 9663 : n_queen [java]  (0) 2023.03.23
객체 지향 설계 원칙  (1) 2023.03.06