728x90
반응형

🧭 목차

  1. 자바(Java)란?
  2. 자바의 주요 특징
  3. 자바의 객체지향 4대 특성

1. 자바(Java)란?

자바(Java)는 1995년, **썬 마이크로시스템즈(Sun Microsystems)**의 **제임스 고슬링(James Gosling)**을 비롯한 연구진들이 개발한 객체 지향 프로그래밍 언어입니다.

원래는 가전제품의 내장 소프트웨어를 위해 개발되었지만,
지금은 웹 애플리케이션, 모바일 앱(Android), 데스크톱 앱
다양한 분야에서 가장 널리 사용되는 언어 중 하나입니다.


2. 자바의 특징

● 객체 지향 언어 (Object-Oriented)

  • 절차 지향과 달리 기능 단위를 **객체(Object)**로 구성
  • 객체 간 협력으로 프로그램 동작
  • 유지보수 및 재사용에 유리

● 인터프리터 + 컴파일 언어

  • .java → 컴파일 → .class(바이트 코드) → JVM에서 실행
  • 실행 시 인터프리트 방식으로 동작

● 플랫폼 독립성

  • 한번 작성하면 어떤 OS에서도 실행 가능
  • 이유: **JVM(Java Virtual Machine)**이 각 OS에 맞게 동작

● 자동 메모리 관리 (Garbage Collection)

  • 개발자가 직접 메모리 해제할 필요 없음
  • 불필요한 객체는 GC가 자동 정리

● 멀티 쓰레딩 지원

  • 여러 작업을 동시에 처리 가능
  • 운영체제마다 쓰레드 API가 달라도, 자바는 자바 API로 일관성 유지

● 동적 바인딩

  • 필요한 객체만 생성
  • 런타임에 동적으로 클래스 및 메소드 결정

3. 자바의 객체지향 4대 특성

🔒 캡슐화 (Encapsulation)

  • 관련 데이터와 메소드를 클래스로 묶음
  • 외부 접근 제한 (정보 은닉)
접근 제어자설명
public 외부/내부 모두 접근 가능
protected 상속받은 클래스에서 접근 가능
default 같은 패키지 내에서 접근 가능
private 클래스 내부에서만 접근 가능
 

👪 상속 (Inheritance)

  • 기존 클래스(부모)의 기능을 재사용
  • 자식 클래스는 extends 키워드로 상속
  • 모든 클래스는 Object 클래스 상속
  • 자바는 단일 상속만 허용
  • Is a: 상속 관계 (예: Student is a Person)
  • Has a: 포함 관계 (예: Car has a Tire)

📦 추상화 (Abstraction)

  • 공통된 속성과 기능만 추출
  • 복잡한 구현은 감추고, 필요한 인터페이스만 공개
  • 추상 클래스 또는 인터페이스로 구현

🔄 다형성 (Polymorphism)

  • 하나의 인터페이스로 다양한 구현
  • 대표적인 두 가지 형태:

▪ 오버라이딩 (Overriding)

  • 부모 메소드를 재정의
  • @Override 어노테이션 사용
  • 조건: 이름, 매개변수, 리턴타입 동일

▪ 오버로딩 (Overloading)

  • 같은 이름의 메소드를 여러 버전으로 정의
  • 조건: 매개변수의 수나 타입이 달라야 함

✅ 마무리

자바는 배우기 쉬우면서도, 실무에서 가장 강력한 도구 중 하나입니다.
웹 백엔드, 안드로이드 앱, 클라우드 서비스 등 어디서나 만나볼 수 있죠.
객체지향의 강력한 특성과 다양한 기능들 덕분에 오늘날도 여전히 인기 있는 언어입니다.

 

💡 다음 포스팅 예고


✅ JVM, JDK, JRE 차이 완전 정리

728x90
728x90
반응형

🧭 목차

  1. 객체지향 언어란?
  2. 클래스, 객체, 인스턴스의 차이
  3. 객체지향의 3대 특징
  4. 객체지향의 장단점
  5. 대표적인 객체지향 언어

1. 객체지향 언어란?

**객체지향 언어(Object-Oriented Language)**는
현실 세계의 **모든 객체(자동차, 사람, 문 등)**가
자신만의 속성과 기능을 가지고 상호작용한다는 개념을
프로그래밍에 적용한 언어입니다.

  • 객체 간의 관계와 역할에 중점을 둠
  • 각 객체는 고유한 속성과 기능을 가지고 있음
  • 이 객체들이 협력하며 동작하는 구조로 소프트웨어를 구성

2. 클래스(Class), 객체(Object), 인스턴스(Instance)

구분설명
객체 프로그램에서 구현하고자 하는 대상 (예: 자동차, 회원, 게시물 등)
클래스 객체의 속성과 기능을 정의한 설계도
인스턴스 클래스를 기반으로 실제 메모리에 생성된 객체 (현실 세계의 실체)
 
 
class Car {
    String color;
    void drive() {
        System.out.println("주행 중");
    }
}

Car myCar = new Car();  // ← 이게 바로 인스턴스!

3. 객체지향 언어의 3대 특징

🔒 캡슐화 (Encapsulation)

  • 객체의 내부 구조를 외부에 은닉
  • 필요한 정보만 외부에 public으로 노출
  • 자바에서는 private, protected, public 등 접근 제어자로 구현

➡ 예:

private int age;  
public void setAge(int a) { age = a; }

👪 상속 (Inheritance)

  • 자식 클래스가 부모 클래스의 속성과 기능을 물려받는 것
  • 코드의 재사용성 높이고, 유지보수 편리
class Animal { void eat() { } }
class Dog extends Animal { void bark() { } }
  • 부모 클래스 → 슈퍼 클래스(Super Class)
  • 자식 클래스 → 서브 클래스(Sub Class)

🔄 다형성 (Polymorphism)

  • 하나의 메소드나 객체가 다양한 방식으로 동작

▪ 오버라이딩 (Overriding)

  • 부모 메소드를 자식 클래스에서 재정의
  • 메소드명, 매개변수, 반환형 동일
@Override
public void run() {
    System.out.println("자식 클래스에서 실행");
}

▪ 오버로딩 (Overloading)

  • 같은 이름의 메소드지만 매개변수 다름
@Override
public void run() {
    System.out.println("자식 클래스에서 실행");
}

4. 객체지향 프로그래밍의 장점과 단점

✅ 장점

  • 재사용성: 상속으로 기존 코드 활용
  • 생산성 향상: 독립적인 객체 개발
  • 자연스러운 모델링: 현실 세계와 유사
  • 유지보수 우수: 캡슐화로 영향 최소화

❌ 단점

  • 설계 복잡: 개념 파악 및 초기 설계 시간 소요
  • 실행 속도 저하: 절차형 언어보다 느릴 수 있음
  • 코딩 난이도: 복잡한 구조로 인한 학습 장벽

5. 대표적인 객체지향 언어

언어특징
Java 가장 널리 쓰이는 객체지향 언어, 플랫폼 독립적
C++ C 언어의 확장, 다중 상속 지원
C# 닷넷(.NET) 기반 객체지향 언어
Python 인터프리터 기반, 동적 타이핑, 강력한 객체지향 지원
 

 

728x90
728x90
반응형

“ArrayList? Set? Hash 뭐시기? 그냥 배열에 때려 넣으면 안 돼요?”


1. Java Collections Framework(JCF)란?

JCF는 자바에서 데이터를 그룹으로 관리하기 위한 자료구조 라이브러리 집합입니다.
배열을 대체하고, 더 강력하게 데이터를 처리할 수 있게 해줍니다.


2. 컬렉션 상속 구조도

         ┌──────────┐
         │Collection│
         └────┬─────┘
      ┌────────┼────────┐
     List      Set     Queue
      │         │        │
┌─────┴─────┐  ┌┴┐     ┌─┴─┐
ArrayList  ... HashSet ...

※ Map은 Collection을 상속하진 않지만, 함께 묶어서 취급합니다.


3. 주요 인터페이스와 특징

✅ Set (중복 ❌, 순서 ❌)

구현체특징
HashSet 가장 빠른 접근 속도, 순서 없음
TreeSet 자동 정렬 가능 (오름차순/내림차순 설정 가능)
 

✅ List (중복 ⭕, 순서 ⭕)

구현체특징
ArrayList 인덱스 기반, 조회 성능 우수
LinkedList 삽입/삭제에 유리
Vector 동기화 지원. 구식이라 거의 안 씀
 

✅ Queue (선입선출 구조)

구현체특징
LinkedList 양방향 연결 구조
PriorityQueue 우선순위 기반 처리 가능
 

✅ Map (Key 중복 ❌, Value 중복 ⭕

구현체특징
HashMap 가장 자주 쓰이며, null 허용
TreeMap 자동 정렬
Hashtable 동기화 지원. null 금지, 구식
 

4. 언제 어떤 컬렉션을 써야 할까?

상황추천 컬렉션
중복 없이 저장 HashSet
인덱스 접근, 조회 위주 ArrayList
삽입/삭제 잦음 LinkedList
Key-Value 저장 HashMap
정렬된 데이터 필요 TreeSet, TreeMap
스레드 동기화 필요 Vector, Hashtable (하지만 잘 안 씀)
 

5. 한줄 요약

"Java 컬렉션은 목적에 맞게 잘 골라 써야 성능이 살아납니다!"

 

728x90
728x90
반응형

인프런 강의를 듣던 중 회원 도메인 설계를 하다가 동시성 이슈 때문에 HashMap보다는 ConcurrentHashMap을 사용한다라고 배웠습니다. 과연 두 개의 차이점은 어떤 점 있는지, 각 각의 장단점을 깊게 파보고 싶어서 정리해보았습니다.

출처:  https://javaconceptoftheday.com/hashmap-vs-concurrenthashmap-in-java/


 해외 문서를 찾아보다가 잘 정리되어 있는 문서를 발견하고 정리해보았습니다.


HashMap과 ConcurrentHashMap의 차이점


1) Thread Safe

주요 차이점은 ConcurrentHashMap는 내부적 동기화 때문에 스레드가 Safe합니다. 

HashMap는 내부적으로 동기화되지 않고 스레드로부터 안전하지 않습니다. HashMap 메서드를 사용하여 외부에서 동기화 할 수 있습니다.

 

2) Internal Structure(내부구조)

ConcurrentHashMap의 모든 작업이 동기화되는 것은 아닙니다. 추가 및 삭제와 같은 수정 작업만 동기화됩니다. 읽기 작업은 동기화되지 않습니다. 이렇게 하면 ConcurrentHashMap이 외부에서 동기화된 HashMap보다 동시 다중 스레드 응용 프로그램에 대한 첫 번째 선택 맵이 됩니다.

 

3) Null Keys And Null Values

HashMap은 최대 하나의 null 키와 임의의 수의 null 값을 허용합니다.ConcurrentHashMap은 null 키와 null 값도 허용하지 않습니다.

 

4) Fail-Fast Vs Fail-Safe

HashMap에 의해 반환된 반복자는 본질적으로 빠른 속도입니다. 반복자 생성 후 맵이 수정되면ConcurrentModificationException이 발생하기 때문입니다. ConcurrentHashMap에 의해 반환된 반복자는 본질적으로 안전합니다. iterator 생성 후 맵이 수정되면 예외가 발생하지 않습니다.

 

5) Performance(성능)

ConcurrentHashMap에 대한 수정 작업만 동기화됩니다. 따라서 ConcurrentHashMap에 대한 추가 또는 제거 작업은 HashMap보다 느립니다. ConcurrentHashMap 및 HashMap 모두에 대한 읽기 작업은 두 맵의 읽기 작업이 동일한 성능을 제공합니다.

결론적으로 ConcurrentHashMap는 내부적으로 동기화 함으로, 동시 멀티 쓰레드 어플리케이션에 적합합니다. HashMap은 내부적으로 동기화 되지않습니다. 따라서 단일 쓰레드 프로그램에 적합합니다.

 

https://applepick.tistory.com/124

 

[동시성 이슈해결] HashMap보다는 ConcurrentHashMap을 쓰자!

인프런 강의를 듣던 중 회원 도메인 설계를 하다가 동시성 이슈 때문에 HashMap보다는 ConcurrentHashMap을 사용한다라고 배웠습니다. 과연 두 개의 차이점은 어떤 점 있는지, 각 각의 장단점을 깊게 파

applepick.tistory.com

 

728x90
728x90
반응형

● 환경 변수를 설정하는 이유

PATH는 파일이 있는 그 폴더가 아닌 다른 폴더에서 해당 폴더에 접근하기 위해 지정해 준다.

자바에서 PATH를 잡는 이유는 javac의 컴파일 때문이다.

JVM에 의해선 자바는 다른 폴더에서도 실행 되지만, 컴파일 할 때 필요한 javac는 PATH를 잡지 않으면 실행이 안된다. 즉, javac를 어디서든 사용하고 bin 디렉토리 내 모든 자바 전용 툴을 사용하기 위해 환경변수를 설정 해야만 한다.

시스템 변수 : 하나의 OS에 여러명의 사용자 계정이 있더라도 공통으로 적용

사용자 변수 : 하나의 OS에 여러명의 사용자 계정이 있을 경우 특정 사용자만 적용됨

 

● JAVA_HOME

자바 프로그램에서 JAVA_HOM을 인식하기 때문에 설정한다

자바로만 프로그래밍한다면 PATH, CLASSPATH만 잡아줘도 잘 작동하지만, 나중에 자바 버전을 변경할 때 JAVA_HOME만 변경하면 PATH와 CLASSPATH는 변경하지 않아도 되기 때무ㅜㄴ에 JAVA_HOME을 잡아 두는것이 좋다.

ex) C:\jdk\java11;

 

● PATH

OS환경변수의 하나로 실행파일 경로를 지정

javac에 대한 PATH를 설정해보자

PATH를 설정하면 해당 폴더 외 다른 폴더에서도 경로를 찾아 javac를 실행 할 수 있게 해준다.

ex) %JAVA_HOME%\bin;

 

● CLASSPATH

자바에서 사용하는 PATH. 자바는 CLASS를 사용

PATH와 비슷한 개념이지만 자바의 CLASS 파일들을 위한 환경변수이다. 편리하게  packge를 import할 수 있다.

ex) %JAVA_HOME%\lib;

728x90
728x90
반응형

class lotto1 {
    private final static int[] lottoResult = new int[6];
    /**
     * 이번주 로또 1등번호
     */
    public static int[] lottoResult() {
        for (int i = 0; i < lottoResult.length; i++) {
            lottoResult[i] = (int) ((Math.random() * 45) + 1);
            // 동일 번호 확인
            for (int j = 0; j < i; j++) {
                if (lottoResult[i] == lottoResult[j]) {
                    i--;
                }
            }
        }
        // 번호 정렬
        numSort(lottoResult, 0);
        for (int i = 0; i < lottoResult.length; i++) {
            System.out.println("이번주 1등 번호 = " + lottoResult[i]);
        }
        return lottoResult;
    }


    private static int[] purchaseNum = new int[6];
    /**
     * 구매한 로또 번호
     */
    public static int[] purchaseLotto() {
        for (int i = 0; i < purchaseNum.length; i++) {
            purchaseNum[i] = (int) ((Math.random() * 45) + 1);
            for (int j = 0; j < i; j++) {
                if (purchaseNum[i] == purchaseNum[j]) {
                    i--;
                }
            }
        }

// 일반 오름차순 정렬

Arrays.sort(purchaseNum);


        // 직접 구현한 버블 소트 번호 정렬 - 성능상 젤 구림
        numSort(purchaseNum, 0);
        for (int i = 0; i < purchaseNum.length; i++) {
            System.out.println("구매한 로또 번호 = " + purchaseNum[i]);
        }
        return purchaseNum;
    }


    /**
     * 이번 로또 몇개 사면 됬을까?
     */
    public static void resultCheck() {
        int[] oriNum = lottoResult;
        Integer cnt = 0;
        while (true) {
            Integer cn = cnt++;
            int[] purNum = purchaseLotto();
            boolean equals = Arrays.equals(oriNum, purNum);
            System.out.println(cn);
            if (equals == true) {
                break;
            }
        }
    }


    /**
     * 아래 두 메소드는 1차원 정렬 메소드

    * 버블 소트 정렬  성능상 젤 구림

     */
    public static void numSort(int[] arr, int start) {
        if (start < arr.length - 1) {
            int min_index = start;
            for (int i = start; i < arr.length; i++) {
                if (arr[i] < arr[min_index]) {
                    min_index = i;
                }
            }
            swap(arr, start, min_index);
            numSort(arr, start + 1);
        }
    }


    public static void swap(int[] arr, int index1, int index2) {
        int tmp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = tmp;
    }
}

728x90

+ Recent posts