본문 바로가기

프로그래밍 언어/Java

Java란 무엇인가? 객체 지향 프로그래밍의 시작

Java란 무엇인가? 객체 지향 프로그래밍의 시작

Java는 전 세계적으로 널리 사용되는 객체 지향 프로그래밍 언어로, 1995년에 Sun Microsystems에 의해 개발되었습니다. 플랫폼 독립성과 강력한 라이브러리, 그리고 보안성 덕분에 Java는 다양한 애플리케이션 개발에 사용되고 있습니다. 이 글에서는 Java의 기본 개념과 함께, 객체 지향 프로그래밍의 핵심 원칙을 자세히 설명하겠습니다.

 

 

목차

  1. Java의 역사와 특징
  2. Java의 기본 구조
  3. 객체 지향 프로그래밍이란?
  4. 클래스와 객체
  5. 상속과 다형성
  6. 예외 처리

 

1. Java의 역사와 특징

Java는 처음에 가전 제품에서 동작하는 소프트웨어를 개발하기 위해 만들어졌지만, 이후 인터넷의 발전과 함께 서버와 클라이언트 애플리케이션 개발에 널리 사용되었습니다. Java는 'Write Once, Run Anywhere'라는 철학을 바탕으로 개발되었으며, 이는 Java로 작성된 프로그램이 운영체제에 관계없이 JVM(Java Virtual Machine)에서 실행될 수 있다는 것을 의미합니다. 이러한 플랫폼 독립성은 Java의 주요 장점 중 하나입니다.

Java의 또 다른 중요한 특징은 가비지 컬렉션(Garbage Collection)을 통해 메모리 관리를 자동으로 처리한다는 점입니다. 이로 인해 프로그래머는 메모리 누수 문제를 최소화할 수 있습니다.

 

 

 

2. Java의 기본 구조

Java 프로그램은 클래스로 구성되며, 모든 실행 코드는 클래스 내부에 위치합니다. Java 프로그램의 시작점은 항상 main 메서드입니다. 기본적인 Java 프로그램의 구조는 다음과 같습니다:


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

public class Main은 'Main'이라는 클래스를 선언하는 부분입니다. public static void main(String[] args)는 프로그램의 진입점으로, System.out.println을 사용해 문자열을 출력합니다.

 

 

 

3. 객체 지향 프로그래밍이란?

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체라는 단위로 나누어 설계하는 방식입니다. 객체는 데이터(속성)와 그 데이터를 처리하는 메서드(함수)를 함께 포함하는 단위입니다. OOP는 코드 재사용성과 확장성을 높이기 위해 개발되었으며, 다음과 같은 네 가지 주요 개념으로 이루어져 있습니다:

  • 캡슐화(Encapsulation): 객체의 속성과 메서드를 하나로 묶고, 외부로부터 직접 접근하지 못하게 보호하는 개념입니다.
  • 상속(Inheritance): 상위 클래스의 속성과 메서드를 하위 클래스가 물려받아 사용하는 기능입니다.
  • 다형성(Polymorphism): 동일한 메서드 이름이 다양한 클래스에서 다른 방식으로 동작하는 개념입니다.
  • 추상화(Abstraction): 중요한 정보만을 노출하고, 불필요한 구현 세부 사항은 숨기는 방식입니다.

 

 

 

4. 클래스와 객체

클래스는 객체를 생성하기 위한 설계도입니다. 클래스는 속성(필드)과 메서드(함수)를 정의하며, 이를 바탕으로 실제 객체가 생성됩니다. Java에서 객체를 생성하는 방법은 다음과 같습니다:


    class Car {
        String color;
        int speed;

        void drive() {
            System.out.println("The car is driving.");
        }
    }

    public class Main {
        public static void main(String[] args) {
            Car myCar = new Car();  // 객체 생성
            myCar.color = "red";
            myCar.speed = 100;
            myCar.drive();
        }
    }
    

여기서 Car 클래스는 자동차의 속성과 동작을 정의하고 있습니다. myCar 객체는 Car 클래스로부터 생성된 객체로, colorspeed 속성을 설정하고 drive() 메서드를 호출할 수 있습니다.

 

 

 

 

5. 상속과 다형성

상속은 상위 클래스의 속성과 메서드를 하위 클래스가 물려받아 사용할 수 있도록 하는 기능입니다. 이를 통해 코드의 중복을 줄이고, 유지보수성을 높일 수 있습니다. 다음은 상속의 예입니다:


    class Animal {
        void sound() {
            System.out.println("This is an animal sound.");
        }
    }

    class Dog extends Animal {
        void sound() {
            System.out.println("The dog barks.");
        }
    }

    public class Main {
        public static void main(String[] args) {
            Animal myDog = new Dog();  // 다형성
            myDog.sound();  // "The dog barks." 출력
        }
    }
    

Animal 클래스는 기본적인 sound() 메서드를 가지고 있으며, Dog 클래스는 이를 상속받아 sound() 메서드를 재정의(오버라이딩)합니다. 다형성을 통해 Animal 형식의 변수가 Dog 객체를 참조할 수 있으며, 재정의된 메서드가 호출됩니다.

 

 

 

6. 예외 처리

Java에서는 프로그램 실행 중 발생할 수 있는 오류를 처리하기 위해 예외(Exception) 처리를 사용합니다. 예외 처리를 통해 프로그램이 비정상 종료되지 않도록 할 수 있습니다. Java의 예외 처리 구문은 try, catch, finally 블록으로 구성됩니다:


    public class Main {
        public static void main(String[] args) {
            try {
                int result = 10 / 0;  // 0으로 나누기 오류
            } catch (ArithmeticException e) {
                System.out.println("Error: Cannot divide by zero.");
            } finally {
                System.out.println("This will always run.");
            }
        }
    }
    

try 블록에서 오류가 발생하면 catch 블록이 실행되어 예외를 처리합니다. finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드입니다.