1.1.1 자바 기초 개념

자바는 세계에서 가장 인기 있는 프로그래밍 언어 중 하나로,

객체 지향적(OOP) 특성과 플랫폼 독립적인 특징 때문에 널리 사용됩니다.

본 세부 카테고리에서는 자바의 기초부터 고급 개념까지 다루어,

초보자부터 경험 있는 개발자까지 모두에게 유용한 정보를 제공하고자 합니다.

자바 시작하기

자바 설치 및 환경 설정

자바 개발 키트(JDK) 설치 방법과 환경 변수 설정

JDK 설치
  1. Oracle 웹사이트 방문: Oracle 공식 웹사이트(https://www.oracle.com/java/technologies/javase-jdk11-downloads.html)에서 최신 버전의 JDK를 다운로드합니다.

  2. 설치 파일 다운로드: 시스템에 맞는 버전(Windows, macOS, Linux)을 선택하여 다운로드합니다.

  3. 설치: 다운로드한 파일을 실행하여 설치를 진행합니다. 설치 과정 중 기본 설정을 따르면 대부분의 경우 문제없이 설치가 완료됩니다.

환경 변수 설정
  1. 시스템 환경 변수 편집:
    • Windows: 제어판 > 시스템 및 보안 > 시스템 > 고급 시스템 설정 > 환경 변수
    • macOS/Linux: 터미널을 열고 .bash_profile, .profile 또는 .zshrc 파일을 편집합니다.
  2. JAVA_HOME 설정:
    • Windows: ‘새로 만들기' 버튼을 클릭하여 ‘변수 이름'에 JAVA_HOME을, ‘변수 값'에 JDK가 설치된 경로를 입력합니다. (예: C:\Program Files\Java\jdk-11.0.1)
    • macOS/Linux: 터미널에서 export JAVA_HOME=$(usr/libexec/java_home)를 입력하여 .bash_profile, .profile 또는 .zshrc에 추가합니다.
  3. Path 설정:
    • 모든 운영 체제에서, Path 환경 변수를 편집하여 %JAVA_HOME%\bin (Windows) 또는 $JAVA_HOME/bin (macOS/Linux)을 추가합니다.
  4. 변경 사항 적용:
    • 설정을 마친 후, 모든 변경 사항을 적용하기 위해 컴퓨터를 재시작하거나 새 터미널 세션을 시작합니다.

첫 번째 자바 프로그램 작성

"Hello, World!" 프로그램을 통해 기본 구조와 문법 이해

프로그램 작성
  1. 텍스트 편집기 열기: Notepad, Visual Studio Code, IntelliJ IDEA 등 원하는 텍스트 편집기를 엽니다.

  2. HelloWorld.java 파일 생성:

     public class HelloWorld {
         public static void main(String[] args) {
             System.out.println("Hello, World!");
         }
     }
    

    위 코드를 HelloWorld.java 파일로 저장합니다.

프로그램 컴파일과 실행
  1. 커맨드 라인(명령 프롬프트 또는 터미널) 열기.

  2. Java 파일이 저장된 디렉토리로 이동:
     cd 경로/디렉토리
    
    • 경로/디렉토리HelloWorld.java 파일이 있는 실제 경로로 바꿉니다.
  3. Java 프로그램 컴파일:
     javac HelloWorld.java
    
    • javac 명령어는 .java 파일을 .class 파일(바이트코드)로 컴파일합니다.
  4. Java 프로그램 실행:
     java HelloWorld
    
    • 컴파일된 .class 파일을 실행합니다. 화면에 Hello, World!가 출력되면 성공적으로 프로그램이 실행된 것입니다.

기초 개념

변수와 데이터 타입

자바에서 데이터를 저장하고 조작하기 위해 여러 가지 데이터 타입을 사용합니다. 

이러한 데이터 타입은 크게 기본형(Primitive types)과 참조형(Reference types)으로 나뉩니다. 

여기서는 기본형 데이터 타입과 변수를 선언하는 방법에 초점을 맞춥니다.

자바에서 사용하는 기본 데이터 타입과 변수 선언 방법

기본형 데이터 타입은 다음과 같이 8가지가 있습니다:

  • 정수형: byte, short, int, long
  • 실수형: float, double
  • 논리형: boolean
  • 문자형: char

각 데이터 타입은 다음과 같이 사용됩니다:

  • byte: 1바이트 크기, 정수를 저장하는 데 사용
  • short: 2바이트 크기, 작은 정수를 저장하는 데 사용
  • int: 4바이트 크기, 일반적으로 사용되는 정수를 저장하는 데 사용
  • long: 8바이트 크기, 큰 정수를 저장하는 데 사용
  • float: 4바이트 크기, 소수점을 포함하는 수를 저장하는 데 사용
  • double: 8바이트 크기, float보다 더 큰 소수점을 포함하는 수를 저장하는 데 사용
  • boolean: true 또는 false 값만을 가지며, 조건문과 논리 연산에서 사용
  • char: 2바이트 크기, 단일 문자를 저장하는 데 사용

변수를 선언하는 방법은 타입을 명시한 다음 변수 이름을 적고, 필요한 경우 값을 초기화합니다.
예를 들어:

int age = 30;
boolean isStudent = false;
char grade = 'A';
double averageScore = 82.5;

위 예제에서 int, boolean, char, double은 데이터 타입이며,

age, isStudent, grade, averageScore는 변수 이름입니다.

변수 이름 뒤에 오는 = 연산자는 변수를 초기화하는 데 사용됩니다.

조건문과 반복문

조건문과 반복문은 프로그램의 흐름을 제어하는 데 사용되며, 자바에서는 if, switch, for, while을 주로 사용합니다.

if 문

if 문은 주어진 조건이 참true일 경우, 특정 코드 블록을 실행합니다. 조건이 거짓false일 경우, 해당 코드 블록은 건너뛰어집니다. 추가적으로 elseelse if를 사용하여 여러 조건을 체크할 수 있습니다.

if (조건) {
    // 조건이 참일 때 실행할 코드
} else if (다른 조건) {
    // 다른 조건이 참일 때 실행할 코드
} else {
    // 어떤 조건도 참이 아닐 때 실행할 코드
}

switch 문

switch 문은 하나의 변수의 값에 따라 여러 경우의 실행 경로를 정의할 수 있습니다.
case 키워드를 사용하여 각각의 경우를 정의하고,
해당 변수의 값과 일치하는 case의 코드 블록을 실행합니다.

switch (변수) {
    case 값1:
        // 변수가 값1과 일치할 때 실행할 코드
    break;
    case 값2:
        // 변수가 값2와 일치할 때 실행할 코드
        break;
    default:
        // 어떤 case도 일치하지 않을 때 실행할 코드
}

for 문

for 문은 초기 조건, 종료 조건, 반복 후 작업(보통 카운터의 증가 또는 감소)을 기반으로 코드 블록을 반복적으로 실행합니다.
특히, 배열이나 컬렉션을 순회할 때 유용합니다.

for (초기화; 조건; 반복  작업) {
    // 반복해서 실행할 코드
}

while 문

while 문은 주어진 조건이 참인 동안, 코드 블록을 반복해서 실행합니다. 조건이 거짓이 되면 반복이 중단됩니다.

while (조건) {
    // 조건이 참인 동안 반복해서 실행할 코드
}

do-while 문은 while 문과 비슷하지만, 코드 블록을 최소 한 번 실행한 후 조건을 평가합니다.

do {
    // 최소 한 번은 실행할 코드
} while (조건);

이러한 조건문과 반복문을 활용하여 프로그램에서 다양한 결정을 내리고, 반복 작업을 수행할 수 있습니다.

메소드

메소드는 자바 프로그래밍에서 중요한 구성 요소로, 특정 작업을 수행하는 코드 블록입니다.
여기서는 메소드의 정의와 호출 방법, 매개변수와 반환값에 대해 설명합니다.

메소드의 정의와 호출

메소드를 정의할 때는 반환 타입, 메소드 이름, 그리고 괄호 안에 매개변수 목록을 포함합니다.
메소드가 실행할 작업을 중괄호 {} 안에 작성합니다.
메소드가 특정 작업 후에 값을 반환하지 않는 경우, 반환 타입으로 void를 사용합니다.

메소드의 예:

public int add(int num1, int num2) {
    return num1 + num2;
}

위 메소드는 두 정수를 입력받아 더한 값을 반환합니다.

메소드 호출은 메소드가 정의된 후, 메소드 이름과 괄호 안에 적절한 인자를 넣어서 실행합니다.
예를 들어, add(5, 3)는 두 수 5와 3을 더하는 메소드 add를 호출합니다.

매개변수

매개변수는 메소드에 전달되는 입력값을 정의하는 변수입니다.
메소드가 실행될 때 필요한 데이터를 외부에서 받아오기 위해 사용됩니다.
메소드는 0개 이상의 매개변수를 가질 수 있으며, 각 매개변수는 메소드 내에서만 유효합니다.

반환값에 대한 이해

메소드는 작업의 결과를 호출한 곳으로 반환할 수 있습니다. 반환값이 있는 메소드는 return 키워드를 사용하여 결과값을 반환합니다.
모든 메소드가 값을 반환하는 것은 아니며, 값을 반환하지 않는 메소드의 경우 반환 타입으로 void를 지정합니다.
반환 타입은 메소드가 반환하는 값의 데이터 타입을 명시합니다.

예를 들어, calculateArea 메소드가 원의 면적을 계산하여 그 결과를 double 타입으로 반환하는 경우, 메소드 정의는 다음과 같습니다:

public double calculateArea(double radius) {
    return 3.14 * radius * radius;
}

이 메소드는 원의 반지름을 매개변수로 받아 면적을 계산한 후, 그 결과를 반환합니다.

메소드를 사용하면 코드의 재사용성을 높이고, 프로그램의 구조를 개선할 수 있습니다. 메소드를 통해 복잡한 문제를 작은 단위로 나누어 해결하는 것이 가능해집니다.

배열과 컬렉션 자바에서의 배열 사용법과 ArrayList, HashMap 같은 컬렉션 프레임워크 활용

자바에서 데이터를 저장하고 관리하는 데 있어 배열과 컬렉션 프레임워크는 매우 중요합니다. 여기서는 배열의 기본 사용법과 컬렉션 프레임워크 중 ArrayListHashMap의 사용법에 대해 설명합니다.

배열

배열은 동일한 타입의 여러 변수를 하나의 묶음으로 다루는 방법입니다. 자바에서 배열을 사용하려면, 배열의 타입과 크기를 지정해야 합니다.

배열 선언과 초기화
int[] myArray = new int[5];

위 코드는 5개의 정수를 저장할 수 있는 배열을 선언하고 생성합니다. 모든 배열 요소는 자동으로 기본값(정수의 경우 0)으로 초기화됩니다.

배열을 선언하면서 동시에 초기화하는 방법도 있습니다.

int[] myArray = {1, 2, 3, 4, 5};

이렇게 하면 배열 myArray는 5개의 정수를 담고, 각 요소에는 괄호 안의 값들이 순서대로 저장됩니다.

컬렉션

컬렉션 프레임워크는 데이터 집합을 효율적으로 관리하기 위한 클래스와 인터페이스의 집합입니다. 여기서는 ArrayListHashMap에 대해 살펴봅니다.

ArrayList

ArrayList는 배열과 유사하지만, 크기가 자동으로 조정되는 동적 배열입니다. ArrayList에 데이터를 추가, 삭제하면 자동으로 크기가 변경됩니다.

ArrayList<String> list = new ArrayList<String>();
list.add("Java");
list.add("Python");
list.add("C++");

ArrayListadd 메소드를 사용하면 요소를 추가할 수 있습니다. get 메소드로 특정 인덱스의 요소에 접근할 수 있습니다.

HashMap

HashMap은 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 컬렉션입니다. 각 키는 유일하며, 이를 통해 값을 검색할 수 있습니다.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Cherry", 3);

HashMapput 메소드를 사용하여 키와 값을 저장합니다. get 메소드로 키를 사용해 값을 검색할 수 있습니다.

배열은 고정된 크기의 동일한 타입의 데이터를 저장하는 데 사용되며, 컬렉션 프레임워크는 다양한 데이터 구조를 제공하여 데이터를 효율적으로 관리할 수 있도록 합니다. ArrayListHashMap은 자바에서 가장 많이 사용되는 컬렉션 타입 중 두 가지입니다.

객체 지향 프로그래밍(OOP) 개념

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체들의 집합으로 표현하며, 이 객체들은 서로 상호작용하는 프로그래밍 패러다임입니다. 자바는 객체 지향 프로그래밍 언어로, 클래스와 객체, 상속, 다형성, 캡슐화와 추상화와 같은 핵심 개념을 지원합니다.

클래스와 객체

클래스의 정의와 객체 생성

클래스는 객체를 생성하기 위한 템플릿 또는 블루프린트입니다. 클래스는 객체의 상태를 나타내는 필드(변수)와 객체의 행동을 나타내는 메소드(함수)를 포함합니다.

public class Dog {
    String breed;
    int age;
    String color;

    void bark() {
        System.out.println("Woof");
    }
}

객체는 클래스의 인스턴스입니다. 클래스를 사용하여 객체를 생성하고, 각 객체는 독립적인 상태와 행동을 가집니다.

Dog myDog = new Dog();
객체 지향 프로그래밍의 기본 개념

객체 지향 프로그래밍의 기본 개념에는 캡슐화, 상속, 다형성이 포함됩니다. 이 개념들은 코드의 재사용성, 유지 보수성, 테스트 용이성을 향상시킵니다.

상속

클래스 간의 상속을 통해 코드 재사용성 및 확장성 이해

상속은 한 클래스가 다른 클래스의 특성을 상속받는 것을 의미합니다. 상속을 통해 기존 코드의 재사용성을 높이고, 확장성을 갖춘 애플리케이션을 구축할 수 있습니다.

public class Animal {
    void eat() {
        System.out.println("This animal eats insects.");
    }
}

public class Bird extends Animal {
    void fly() {
        System.out.println("This bird flies.");
    }
}

다형성

오버로딩

오버로딩은 같은 이름의 메소드를 매개변수의 타입이나 개수를 달리하여 여러 개 정의하는 것입니다.

public class Demo {
    void test() {
        System.out.println("No parameters");
    }

    void test(int a) {
        System.out.println("a: " + a);
    }
}
오버라이딩

오버라이딩은 자식 클래스에서 부모 클래스의 메소드를 재정의하는 것입니다.

@Override
void eat() {
    System.out.println("This bird eats seeds.");
}

캡슐화와 추상화

데이터 은닉

캡슐화는 객체의 데이터(상태)와 그 데이터를 조작하는 메소드를 하나로 묶는 것입니다. 데이터 은닉은 객체의 상세 구현 내용을 숨기는 것을 의미하며, 주로 private 접근 제한자를 사용합니다.

인터페이스

인터페이스는 모든 메소드가 추상 메소드인 클래스로, 다른 클래스가 구현할 수 있는 계약을 제공합니다.

public interface Animal {
    void eat();
}
추상 클래스

추상 클래스는 하나 이상의 추상 메소드를 포함하는 클래스입니다. 추상 클래스는 직접 인스턴스화할 수 없으며, 상속을 통해 서브 클래스에서 구현됩니다.

public abstract class Animal {
    public abstract void eat();
}

객체 지향 프로그래밍의 이러한 개념들은 프로그램을 더욱 유연하고 확장 가능하게 만들어 줍니다.

source: DevOps/1.Programming_Languages_&_Frameworks/1.1.Java/1.1.1.md