OOP, Objects and Methods

JAVA는 객체지향프로그래밍(obeject-oriented-programming,OOP) 언어이다

객체지향프로그래밍란?

프로그램 방법론중 하나로, 프로그램을 객체들이 서로 상호작용 형태로 작성하는 형태로 작성하는 것이고, 이때 상호작용은 메서드를 호출하는 것으로 이루어진다

객체는 같은 종류로 묶을 수 있고, 같은 종류의 객체는 같은 Type또는 class에 속한다고 말한다

다른 high level 언어들에서는 프로시저, 메서드, 함수, 또는 서브프로그램이라는 구조들이 존재한다. 자바에서는 이러한 유형의 구조들 모두 메서드(methods)라고 부른다

메서드를 포함하여 자바의 모든 프로그래밍 구조는 클래스(class)의 일부로 존재한다

정리하자면

정리

  • 객체(object): 프로그램의 기본 단위이자 데이터와 동작의 집합
  • 메서드(methods): 객체가 수행하는 동작 또는 액션
  • 클래스(class): 객체를 만들기 위한 설계도 또는 틀, 자바의 모든 코드는 클래스 내부에 위치해야 한다

자바 프로그램의두 가지 유형

자바 애플리케이션과 애플릿(Applets)

자바 프로그램은 크게 애플리케이션과 애플릿으로 나뉜다

자바 애플리케이션 프로그램

  • 일반적인 자바 프로그램을 의미하며, main이라는 이름의 메서드를 포함한 클래스이다
  • 애플리케이션이 실행될 때, 런타임 시스템은 자동으로 main 메서드에서 시작된다
  • 모든 자바 애플리케이션은 main 메서드에서 시작된다

애플릿(Applets)

  • 웹 브라우저 내에서 실행되도록 설계된 ‘작은 자바 애플리케이션’이다
  • 인터넷 환경에서 실행될 수 있며, 디버깅을 위해 애플릿 뷰어 프로그램을 사용할 수도 있다
  • 항상 윈도우 인터페이스를 사용한다

자바 애플리케이션 예시 코드

public class FirstProgram {
    public static void main(String[] args) {
        System.out.println("Hello reader.");
        System.out.println("Welcome to Java.");
        // ... 생략 ...
    }
}
  • 클래스 이름: FirstProgram
  • 메인 메서드: 프로그램의 엔트리 포인트

System.out.printIn 분석

자바 프로그램은 객체가 동작을 수행하는 방식으로 작동한다. 위의 코드를 분석하면

  • System.out: 화면으로 출력을 보내기 위해 사용되는 객체이다
  • println: System.out 객체가 수행하는 메서드 또는 동작이다

메서드 호출(Invoking or Calling Method)

객체가 메서드를 사용하여 동작을 수행하는것. 객체에 ‘메시지를 전달한다’고도 표현한다

메서드 호출 구문:

  • 객체
  • 점(.)
  • 메서드 이름
  • 괄호
    • 예: System.out.println(“Hello world.”);

자바 프로그램의 컴파일과 실행

Byte-Code와 자바 가상 머신(JVM)

기존 언어의 컴파일은 고수준 프로그램을 특정 컴퓨터의 기계어로 직접 번역했다. 따라서 컴퓨터마다 기계어가 다르기 때문에, 각기 다른 컴파일러가 필요했다. 하지만, 자바의 컴파일러는 프로그램을 Byte-code로 번역한다.

Byte-code

바이트 코드는 자바 가상 머신(JVM)이라는 가상의 컴퓨터를 위한 기계어이다. 따라서 한 번 바이트 코드로 컴파일되면, JVM이 설치된 어떤 컴퓨터에서든 동일하게 실행될 수 있다

JVM은 인터프리터(Interpereter) 형태로 동작한다

  • 인터프리터는 자바 프로그램이 실행될 때, 바이트코드를 특정 컴퓨터의 기계어로 번역해주는 프로그램이다
  • 바이트코드 명령을 하나씩 읽어서 즉시 실행한다
  • 이미 바이트코드로 컴파일된 상태이므로, 이를 기계어로 번역하는 과정은 최초 컴파일 단계보다 상대적으로 쉽고 빠르다

Class Loader

Class Loader

자바 프로그램은 클래스라고 불리는 작은 단위들로 나뉜다. 각 클래스 정의는 보통 별도의 파일에 저장되며 독립적으로 컴파일된다. 따라서 자바 프로그램을 실행하는 데 필요한 여러 클래스들의 바이트코드를 하나로 연결해 주는 프로그램이다

다른 프로그래밍 언어에서는 이와 대응되는 기능을 링커라고 부른다

컴파일 및 실행 방법

자바 프로그램/클래스 컴파일

  • 파일 명명 규칙: 클래스 정의는 반드시 클래스 이름과 동일한 이름을 가져야 하며, 확장자는 .java여야 한다
  • 컴파일 명령: javac 명령어 뒤에 파일 이름을 입력한다
  • 결과물: 클래스 이름과 같고 확장자가 .class인 바이트코드 파일이 생성된다

자바 프로그램 실행

  • 컴파일이 완료된 후 java 명령어를 사용하여 실행한다
  • 실행 과정:
    • 시스템이 main 메서드를 포함한 클래스를 실행한다
    • 필요한 다른 클래스들을 자동으로 로드하고 실행한다
  • 실행 구문: 확장자 없이 클래스 이름만 입력한다

Identifier, variables, constants, primitive-types

식별자(Identifier)

식별자(Identifier)

프로그램 내에 정의된 변수, 클래스, 메서드, 객체 등의 이름을 의미한다

작성 규칙:

  • 숫자로 시작할 수 없다
  • 문자, 숫자, 언더스코어(_)만 사용할 수 있다
  • 길이 제한이 없다
  • 대소문자 구분을 엄격히 한다

예약어 및 미리 정의된 식별자

  • 키워드/예약어: 자바에서 이미 특별한 의미로 정의된 단어들이다
    • 예: public, class, void
  • 미리 정의된 식별자(Predefined identifiers): 표준 라이브러리에 정의된 이름들이다. 재정의가 가능하긴 하지만, 혼란을 줄 수 있으므로 피하는 것이 좋다
    • 예: System, String

명명 규칙

자바 개발자들이 관례적으로 사용하는 이름 짓기 방식이다

  • 변수, 메서드, 객체: 소문자로 시작하고, 단어가 바뀔 때 대문자를 사용한다
    • 예: firstInt, webSwing
  • 클래스: 대문자로 시작한다
    • 예: Count, String

변수 선언

자바의 모든 변수는 사용하기 전에 반드시 선언되어야 한다

  • 역할: 컴파일러에게 어떤 종류의 데이터(타입)이 저장될지 알려준다
  • 구문: 자료형 뒤에 변수 이름을 쓰고 세미콜론(;)으로 마친다

기본 자료형

자비에서 기본적으로 제공하는 8가지 자료형이다

상수(Constants/Literal)

상수(Constants/Literal)

변하지 않는 고정된 값을 상수 또는 리터럴이라고 한다

숫자형 상수

  • 정수형: 소수점이 없다
  • 실수형: 일반적인 소수점 표기 또는 과학적 기수법을 사용할 수 있다

문자 및 기타 상수

  • char (문자): 작은따옴표(' ')를 사용한다
  • String (문자열): 큰따옴표(" ")를 사용한다
  • boolean (논리형): truefalse 두 가지만 존재하며, 반드시 소문자로 작성해야 한다

String 클래스

String 클래스의 기초

비기본 자료형: 자바에서 String은 기본 자료형이 아닌, 문자열을 저장하고 처리하기 위해 미리 정의된 클래스이다

문자열 상수:

  • 큰따옴표로 묶인 모든 문자열은 String 타입의 객체이다
  • 예: "test"

변수 선언:

  • String 타입의 변수에는 객체의 값을 대입할 수 있다
  • 예: String test = "test";

문자열 연결(Concatenation)

’+’ 연산자: 두 문자열을 연결하여 더 긴 하나의 문자열을 만든다

다양한 타입과의 결합:

  • 문자열과 다른 타입을 결합하면 결과는 항상 문자열이 된다
  • 예: "test" + "is test" -> "test is test"

String 메서드

String 클래스는 String 객체, 마침표, 메서드 이름, 그리고 인자를 감싸는 한 쌍의 괄호를 작성하여 호출한다

만역 Stirng 메서드가 값을 반환하다면, 해당 타입의 값이 사용될 수 있는 곳이라면 어디든 위치할 수 있다

  • System.out.println("Length is " + greeting.length());

문자열 내 문자의 위치인덱스를 지칭할 때는 항상 0부터 세어야 한다

String 인덱스

문자열의 각 문자는 0부터 시작하는 인덱스를 가진다

  • 공백과 문장 부호: 글자뿐만 아니라 공백과 마침표 등도 모두 하나의 인덱스를 차지한다

String 클래스의 메서드

문자열 정보 및 검색

메서드설명예시 및 결과
length()문자열의 길이(문자 개수)를 반환합니다."Hello".length() 5
indexOf(String)특정 문자열이 **처음 나타나는 위치(인덱스)**를 반환합니다. 찾지 못하면 -1을 반환합니다."Hello".indexOf("l") 2
lastIndexOf(String)특정 문자열이 마지막으로 나타나는 위치를 반환합니다."Hello".lastIndexOf("l") 3
charAt(int index)지정한 인덱스 위치에 있는 문자 하나를 반환합니다."Hello".charAt(0) 'H'

문자열 추출 및 변현

메서드설명 (번역)예시 및 결과
substring(int start)지정한 인덱스부터 끝까지의 문자열을 추출합니다."Hello".substring(2) "llo"
substring(int start, int end)start부터 end 직전까지의 문자열을 추출합니다."Hello".substring(1, 3) "el"
replace(char old, char new)특정 문자를 새로운 문자로 모두 바꾼 새 문자열을 반환합니다."Hello".replace('l', 'p') "Heppo"
trim()문자열 앞뒤의 공백을 제거합니다. (문자 사이 공백은 유지)" Hi ".trim() "Hi"
toLowerCase()모든 문자를 소문자로 변환합니다."Hello".toLowerCase() "hello"
toUpperCase()모든 문자를 대문자로 변환합니다."Hello".toUpperCase() "HELLO"

문자열 비교

문자열은 == 대신 아래 메서드들을 사용하여 비교하는 것이 원칙이다

메서드설명 (번역)예시 및 결과
equals(String)두 문자열의 내용이 완전히 같은지 비교합니다. (대소문자 구분)"Hi".equals("hi") false
equalsIgnoreCase(String)대소문자를 무시하고 내용이 같은지 비교합니다."Hi".equalsIgnoreCase("hi") true
compareTo(String)사전 순으로 비교하여 차이값을 정수로 반환합니다."a".compareTo("b") 음수
compareToIgnoreCase(String)대소문자 구분 없이 사전 순으로 비교합니다."A".compareToIgnoreCase("a") 0