본문 바로가기
백엔드/JAVA

[JAVA] 개념 정리

by LaDiuM 2024. 11. 12.
목차

    [JAVA] 개념 정리

    Java는 범용적이며 객체 지향적, 플랫폼 독립적인 특성을 가진 프로그래밍 언어로, 다양한 애플리케이션을 작성하는 데에 널리 사용된다. “한 번의 작성으로 어디서나 실행(Write once, Run anywhere)”이라는 원칙 아래 설계된 Java는 광범위한 플랫폼에서 실행될 수 있으며, 특히 그 안정성과 이식성 덕분에 엔터프라이즈 소프트웨어, 모바일 애플리케이션, 웹 애플리케이션 등에 널리 채택되고 있다.


    1. Java의 특징

    Java는 1995년 선마이크로시스템즈(Sun Microsystems, 현재 Oracle)에 의해 출시되었다. 당시 Java는 단순하고 강력하며 안전하면서도 네트워크 중심의 프로그램 개발을 지원하기 위해 만들어졌으며, 이후 많은 변화와 발전을 겪으면서 Java는 현재까지도 다양한 분야에서 널리 쓰이고 있으며 주요 특징은 다음과 같다.

    • 객체 지향 언어: Java는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)을 기반으로 한 언어이다. 이를 통해 코드를 모듈화하고 재사용 가능성을 높여 유지보수성과 확장성을 강화한다.
    • 플랫폼 독립성: Java 프로그램은 JVM(Java Virtual Machine) 위에서 실행되며, JVM이 설치된 어떤 운영체제에서든 동일하게 동작한다. 이로 인해 Windows, macOS, Linux 등 다양한 환경에서 실행이 가능하다.
    • 자동 메모리 관리: Java는 가비지 컬렉터(Garbage Collector)를 통해 메모리를 자동으로 관리하여 메모리 누수와 같은 문제를 최소화한다.
    • 강력한 라이브러리: Java는 풍부한 표준 라이브러리를 제공하며, 네트워킹, 데이터베이스 연동, GUI 개발 등을 쉽게 지원하는 다양한 라이브러리가 포함되어 있다.

    2. Java 객체의 기본 구조

    자바는 객체 지향 프로그래밍(OOP) 언어이며 객체의 기본 단위는 class이다. 아래는 객체의 기본 구조이다.

    // 클래스 선언
    public class Character {
        // 필드 (Field) 영역
        private String id;
        private int strength;
        private int health;
    
        // 생성자 (Constructor) 영역
        public Character(String id, int strength, int health) {
            this.id = id;
            this.strength = strength;
            this.health = health;
        }
    
        // 메서드 (Method) 영역
        public void talk(String message) {
            System.out.println(message);
        }
    }

    2.1 클래스 (Class)

    클래스는 class 키워드 뒤에 클래스 이름을 지정하여 선언한다. 클래스 이름은 관습적으로 대문자로 시작하며, 여러 단어로 이루어진 경우 단어의 첫 글자를 대문자로 표기하는 카멜 케이스 형식을 사용한다.

    • 예시: Java에서의 기본 단위는 class이며, 이 class라는 용어는 게임에서도 주로 사용되듯 역할, 직업이라는 의미를 포함하고 있으며 어떠한 클래스가 특정 역할만을 담당한다라는 의미를 내포하고 있다. 이는 객체 지향 언어에서의 핵심이 되는 개념이기도 하다.

    2.2 필드 (Field)

    필드는 클래스 내부에 선언되는 멤버 변수로, 클래스의 상태나 속성을 표현한다. 필드는 객체가 가지는 데이터를 저장하며, 클래스의 인스턴스가 각각의 고유한 값을 가질 수 있게 한다.

    • 예시: Fieldclass가 특정 역할만 표현한다면 이 역할에 속성이나 특징을 불어넣어 주는 것으로 볼 수 있다. 예를 들어, 클래스의 역할이 게임에서의 캐릭터라고 한다면, 필드는 캐릭터의 , 체력, 아이디가 된다. 클래스를 캐릭터라는 추상적인 역할에서 상태를 가지는 독립적인 존재로 구분시켜 주는 것이 Field라고 할 수 있다.

    2.3 생성자 (Constructor)

    생성자는 객체가 생성될 때 호출되는 특수한 메서드로, 객체의 초기 상태를 설정하는 역할을 한다. 생성자는 클래스와 동일한 이름을 가지며, 반환 타입을 명시하지 않는다. 생성자는 객체를 생성하면서 필드를 초기화하고, 필요한 준비 작업을 수행하여 객체를 사용할 수 있도록 한다.

    • 예시: Constructorclass의 역할이 게임의 캐릭터라고 한다면 캐릭터를 생성하는 것이라고 볼 수 있다. 캐릭터라면 공통적으로 가지는 Field, 체력, 아이디등의 상태는 캐릭터를 생성하기 전까지는 그저 개념상의 존재이고 설정값일 뿐이다. 이 중 아이디는 아얘 비어져 있을 것이다. 하지만 캐릭터를 생성하는 순간 하나의 독립적인 캐릭터로 태어나며 캐릭터가 태어남으로써 class의 역할에 해당하는 객체(인스턴스)가 생성되는 것이다. Constructor는 캐릭터를 생성할 때 아이디 필드의 값을 설정하여 태어나는 순간 아이디를 설정하는 역할을 수행할 수 있다.

    2.4 메서드 (Method)

    메서드는 클래스가 수행할 수 있는 동작을 정의하는 함수이다. 객체의 상태를 변화시키거나 특정 작업을 수행하는데 사용된다.

    • 예시: method라함은 class의 역할이 게임의 캐릭터라고 한다면 캐릭터는 공격하기, 대화하기, 이동하기 등 여러 동작을 수행할 것이다. 이러한 동작 또는 작업을 java에서는 method로 정의한다. 기능적으로는 타 언어에서도 사용하는 함수(function)와 유사하나 객체지향의 특징을 강조하기 위해 java에서는 method로 표현한다.

    위 내용을 이해하였다면 클래스 안에 필드, 생성자, 메서드의 구조와 순서 배치의 의미를 이해할 수 있을 것이다. class라는 역할로 큰 틀을 정하고 맨 처음에 Field로 상태를 표현, Constructor를 통해 객체를 생성하고 Method로 생성된 객체를 조작하는 일련의 과정이 순서대로 표현되어 있다고 볼 수 있다.


    3. 접근 제한자 (Access Modifiers)

    접근 제한자는 클래스, 필드, 생성자, 메서드에 적용하여 외부에서 접근 가능한 수준을 설정한다. 아래 예시에서는 게임을 비유하여 설명해 보았다.

    // 클래스에 선언된 public 접근 제한자
    public class Character {
        // 필드에 선언된 private 접근 제한자
        private String id;
        private int strength;
        private int health;
    
        // 생성자에 선언된 protected 접근 제한자
        protected Character(String id, int strength, int health) {
            this.id = id;
            this.strength = strength;
            this.health = health;
        }
    
        // 메서드에 선언된 default 접근 제한자. 생략하면 default가 기본 접근 제한자이다.
        default void talk(String message) {
            System.out.println(message);
        }
    }

    3.1 public

    • 설명: public 접근 제한자를 사용하면 해당 요소에 어떤 클래스에서도 접근할 수 있다.
    • 사용 예시: 게임이라면 일반 NPC 상인이 파는 물건은 누구나 볼 수 있게 되어있다면 곧 public 접근 제한자라고 할 수 있다.

    3.2 private

    • 설명: private 접근 제한자는 클래스 내부에서만 접근 가능하도록 설정한다.
    • 사용 예시: 게임에서 내가 소지한 아이템을 나만 볼 수 있게 한다면 private 접근 제한자라고 할 수 있다.

    3.3 protected

    • 설명: protected 접근 제한자는 동일 패키지 내의 다른 클래스와 해당 클래스를 상속받은 클래스에서 접근할 수 있도록 한다.
    • 사용 예시: 게임의 대장간에서 파는 무기 등급마다 일정 레벨에 도달해야 목록에 표시된다면 이는 protected 접근 제한자라고 할 수 있다.

    3.4 default

    • 설명: 접근 제한자를 명시하지 않으면 default 접근 제한이 적용된다. 이 경우, 동일한 패키지 내의 클래스들만 접근할 수 있다.
    • 사용 예시: 길드 창고를 예시로 들 수 있다. 길드 창고는 해당 길드원만 접근 가능하고 생성 종류에 상관 없이 다른 길드는 접근이 불가하다면 default 접근 제한자라고 볼 수 있다.

    4. 기초 문법

    java는 C언어의 영향을 받고 만들어진 언어이기 때문에 기본적인 문법도 C언어와 유사하며 각 자료형의 데이터 크기도 동일하다. 여기서는 기본적인 문법만 정리하고 추후 각 문법에 대해 자세히 다뤄보겠다.

    4.1 변수와 자료형

    Java는 정적 타입(static type)을 사용하는 언어로, 변수를 선언할 때 자료형을 반드시 지정해야 한다. 주요 데이터 타입은 다음과 같다.

    • 기본형(Primitive): int, double, char, boolean, byte, short, long, float
    • 참조형(Reference): 배열(Array), 클래스(Class), 인터페이스(Interface), 열거형(Enum), 문자열(String) 등

    자료형 선언 형태

    int age = 25;
    double price = 19.99;
    char grade = 'A';
    boolean isAvailable = true;

    4.2 조건문과 반복문

    조건문과 반복문은 프로그램의 흐름을 제어하는 데 필수적인 요소이다.

    • 조건문: if, else if, else, switch
    • 반복문: for, while, do-while
    int number = 10;
    if (number > 0) {
        System.out.println("Positive number");
    } else {
        System.out.println("Negative number");
    }
    
    for (int i = 0; i < 5; i++) {
        System.out.println("Iteration: " + i);
    }

    5. 객체 지향 프로그래밍의 기본 요소

    Java는 객체 지향 언어이므로 OOP의 주요 원칙인 캡슐화, 상속, 다형성, 추상화를 지원한다. 이러한 개념을 이해하는 것이 Java 프로그래밍, 즉 객체 지향 프로그래밍(OOP) 핵심이다.

    5.1 캡슐화(Encapsulation)

    캡슐화는 데이터를 보호하기 위해 클래스 내부의 속성과 메서드를 숨기는 것이다. Java에서는 접근 제어자를 통해 데이터의 접근 범위를 지정할 수 있다.

    public class Car {
        private String model;
    
        public String getModel() {
            return model;
        }
    
        public void setModel(String model) {
            this.model = model;
        }
    }

    5.2 상속(Inheritance)

    상속은 기존 클래스의 속성과 메서드를 새로운 클래스에서 재사용할 수 있도록 하는 개념이다. Java에서는 extends 키워드를 사용하여 상속을 구현한다.

    public class Vehicle {
        public void start() {
            System.out.println("Vehicle is starting");
        }
    }
    
    public class Car extends Vehicle {
        public void start() {
            System.out.println("Car is starting");
        }
    }

    5.3 다형성(Polymorphism)

    다형성은 동일한 메서드 호출이 상황에 따라 다르게 동작하도록 하는 기능이다. Java에서는 메서드 오버로딩과 오버라이딩을 통해 다형성을 구현할 수 있다.

    public class Animal {
        public void sound() {
            System.out.println("Animal sound");
        }
    }
    
    public class Dog extends Animal {
        @Override
        public void sound() {
            System.out.println("wal wal");
        }
    }

    5.4 추상화(Abstraction)

    추상화는 불필요한 세부 사항을 숨기고 중요한 특징만을 나타내는 것이다. Java에서는 추상 클래스와 인터페이스를 통해 추상화를 구현할 수 있다.

    public abstract class Shape {
        abstract void draw();
    }
    
    public class Circle extends Shape {
        @Override
        void draw() {
            System.out.println("Drawing Circle");
        }
    }

    6. Java의 주요 활용 분야

    Java는 플랫폼 독립성과 높은 성능 덕분에 다양한 분야에서 사용된다. 그중 몇 가지 대표적인 활용 분야를 살펴보자.

    6.1 웹 애플리케이션 개발

    Java는 Spring, Hibernate와 같은 강력한 프레임워크를 통해 웹 애플리케이션 개발에 자주 활용된다. 특히 엔터프라이즈급 대규모 애플리케이션 개발에서 높은 안정성과 유지보수성을 제공한다.

    6.2 안드로이드 앱 개발

    Java는 오랫동안 Android의 기본 프로그래밍 언어로 사용되었다. Android SDK에서 Java를 기반으로 앱을 개발할 수 있으며, 현재 Kotlin이 많이 사용되긴 하지만 Java는 여전히 중요한 언어로 남아 있다.

    6.3 데이터베이스와의 연동

    Java는 JDBC(Java Database Connectivity)를 통해 다양한 데이터베이스와 연동할 수 있다. MySQL, Oracle, PostgreSQL 등과 연동하여 강력한 데이터 관리 시스템을 구축할 수 있다.

    6.4 빅데이터와 머신러닝

    Java는 빅데이터 분석 도구(예: Hadoop)와 분산 처리 시스템에서 널리 사용되며, Apache Spark와 같은 프레임워크와도 통합이 가능하다. 또한, 머신러닝 라이브러리인 Weka 등에서도 Java가 활용된다.


    Java는 강력한 기능과 안정성을 겸비한 언어로, 다양한 플랫폼에서의 활용이 가능하다. 강력한 경쟁 상대로 python이 있지만 JAVA는 오랜 시간 발전하여 높은 성숙도의 생태계와 언어의 특징적인 안정성으로 엔터프라이즈급 기업을 포함하여 널리 사용되는 현대의 중요한 프로그래밍 언어라고 할 수 있다.

    '백엔드 > JAVA' 카테고리의 다른 글

    [JAVA] 예외 처리  (0) 2025.03.28
    [JAVA] 흐름 제어 문법  (2) 2024.12.17
    [JAVA] 자료형  (0) 2024.12.11
    [JAVA] JVM(Java Virtual Machine)  (1) 2024.11.21
    [JAVA] 클래스 타입 및 사용 종류  (0) 2024.11.13