본문 바로가기
  • soobinhand의 기술 블로그
도서/자바 프로그래밍 언어 - James Gosling

[자바 프로그래밍 언어] 1장 자바 개요

by soobinhand 2021. 12. 22.
728x90

1.1     시작하기

  • 자바 프로그램은 클래스로 만들며 이 클래스를 사용해 클래스 인스턴스인 객체를 생성할 수 있다.
  • 프로그램이 실행될 때, main 메소드가 가장 먼저 호출된다.
  • 필드는 클래스나 클래스 객체에 속하는 데이터 변수로써 객체나 클래스의 상태를 표현한다.
  • static은 main 메소드가 이 클래스이 특정 인스턴스가 아닌 클래스 자체에 소속되게 해준다.

1.2     변수

  • 모든 기본 타입은 각각의 기본 타입과 대응되는 객체 타입을 가지고 있다. 이를 래퍼 클래스라 부른다.
  • 지역 변수는 초기화 전에는 정의되지 않은 상태이며 선언 시에 초기화하지 않아도 된다.
  • 실제 호출되는 메소드는 런타임 시에 전달되는 인자의 수와 타입에 따라 결정된다. 이는 매우 강력한 기능이다.

1.3     주석

  • 코드에 주석을 제대로 작성하는 것은 스스로에게 도움이 많이 된다.

1.4     명명된 상수

  • 상수는 프로그램이 실행되는 동안 변하지 않고 유지되는 값을 말한다.
  • 값이 변하지 않도록 하기 위해서는 필드에 final을 선언해야 한다.
  • final 필드나 final 변수는 일단 초기화되면 절대 값이 변경되지 않는다.
  • 열거 타입은 명명된 상수를 표현하기 위해 인스턴스를 미리 정의하는 특별한 클래스이다.

1.5     유니코드 문자

  • 자바는 국제화된 소프트웨어를 지향하기 때문에 코드를 국제 문자 집합 표준인 유니코드로 작성할 수 있다.

1.6     흐름제어

  • 흐름제어는 프로그램에서 어느 문장이 어떤 순서로 실행되어야 하는지를 정의하는 문장이다.
  • for 문의 초기화 영역에는 반복 변수를 선언할 수 있다. 초기화 영역은 반복문을 실행하는 동안에만 존재해야 하는 변수를 정의할 때 편리하다. 그러나 이것은 for 문에만 허용되기 때문에 다른 흐름 제어 문장에서는 사용할 수 없다.

1.7     클래스와 객체

  • 모든 객체는 데이터와 행위를 정의하는 클래스를 가지며 이러한 클래스는 세 종류의 멤버를 가질 수 있다.
  • 필드는 클래스나 객체와 관련된 데이터 변수이다. 필드에는 클래스가 수행한 연산 결과를 저장한다.
  • 메소드는 클래스 내에서 실행 가능한 코드로 구성된다. 즉, 메소드는 문장들로 구성된다. 호출되는 메소드와 메소드에 포함된 문장들은 프로그램 실행과 밀접한 관련이 있다.
  • 클래스와 인터페이스는 다른 클래스와 인터페이스의 멤버가 될 수 있다.
  • 새로 생성된 객체는 힙이라고 하는 시스템 메모리 영역에 할당되며 모든 객체들은 객체 참조를 통해 접근할 수 있다. 이와 같은 변수들의 타입을 참조 타입이라고 한다.
  • 참조되지 않는 객체는 가비지 컬렉터가 알아서 수집하여 제거한다.

1.8     메소드와 매개변수

  • 객체지향의 실제 장점은 데이터를 조작하는 클래스의 구현을 숨기는 데 있다.
  • 메소드는 다른 객체들이 접근할 수 없는 내부 구현에 접근할 수 있다. 다른 객체가 접근할 수 없도록 데이터를 숨기는 것은 데이터 캡슐화의 기본 개념이다.
  • 잘 설계된 클래스는 오직 해당 클래스의 메소드를 통해서만 변경할 수 있도록 데이터를 숨긴다.

1.9     배열

  • 배열은 같은 타입을 가진 변수들의 집합이며 배열의 각 요소들은 정수 인덱스를 통해 접근할 수 있다.
  • 배열의 길이는 배열이 생성되었을 때 초기화되며 절대 변경할 수 없다.

1.10     문자열 객체

  • 문자들은 0부터 length() - 1까지 인덱스화되어 있으며, charAt 메소드를 통해 각각의 문자에 접근할 수 있다.
  • toCharArray 메소드를 사용하면 String 객체에서 문자 배열을 얻을 수도 있다.
  • String 객체는 읽기 전용이며 불변적이다. 그래서 String 객체의 내용은 절대 변경할 수 없다.
  • 문자열을 변경하고 싶다면 StringBuilder와 StringBuffer 클래스를 사용해야 한다.

1.11     클래스 확장

  • 객체지향 프로그래밍의 주요 장점 중 하나는 기존 클래스의 행위를 확장 또는 서브 클래스화하여 기존 클래스의 코드를 재사용할 수 있다는 것이다. 이 때 기존 클래스는 슈퍼 클래스가 된다.
  • 기존 클래스를 확장하여 새로운 클래스인 서브 클래스를 생성하면 서브 클래스는 슈퍼 클래스의 필드와 메소드를 물려받는다.
  • this 참조는 현재 객체를, super 참조는 슈퍼 클래스 객체를 참조한다.
  • 클래스가 명시적으로 다른 클래스를 확장하지 않았더라도 Object 클래스를 묵시적으로 확장하고는 있다.
  • String은 항상 Object지만 Object는 반드시 String이 아니다.
  • 표현식의 타입이 실제로는 다른 타입이라는 것을 컴파일러에게 알려 주는 것을 타입 캐스팅이라고 한다.
  • 서브 클래스가 슈퍼 클래스의 행위를 오버라이드하지 않는다면 서브 클래스는 슈퍼 클래스의 필드와 메소드를 물려받는다.
  • 메소드를 호출할 때는 객체 참조의 타입이 아니라 객체의 실제 클래스를 사용한다.

1.12     인터페이스

  • 인터페이스는 메소드의 선언부만 가진다는 것을 제외하고는 클래스와 동일하다.
  • 클래스는 원하는 만큼의 많은 인터페이스를 구현할 수 있다.
  • 인터페이스 내에는 중첩된 인터페이스와 중첩된 클래스를 선언할 수도 있다.
  • 인터페이스의 모든 멤버들은 묵시적이든 명시적이든 public 이다. 그래서 인터페이스에 접근할 수 있다면 모든 멤버에 접근할 수 있다.

1.13     제네릭 타입

  • List<T>는 기본 타입이 아닌 T 타입을 담을 수 있는 제네릭 리스트이다. T에 원하는 객체를 선언하여 특정 객체를 위한 리스트를 만들 수 있다. 
  • T는 무엇이든 될 수 있다.
  • 와일드카드는 ?로 표시되며, 미지정 타입의 라고 읽는다.

1.14     예외

  • 오류를 감지하고 복구하는 로직을 추가하는 것은 기존 로직을 더 복잡하게 만들 수 있다.
  • 검증된 예외는 오류 처리를 해야 한다. 검증된 예외일 경우에는 오류가 발생할 수 있는 곳에 오류 처리를 반드시 해야 한다. 
  • 비정상적인 오류 상태가 감지되면 메소드는 예외를 발생시킨다.
  • 일반적으로 예외 객체는 오류를 문자열로 표현하는 Exception 클래스를 상속하여 작성한다. 또한 모든 예외들은 Exception의 슈퍼 클래스인 Throwable 클래스의 서브 클래스가 되어야 한다.
  • 예외를 처리하는 일반적인 구문은 try-catch-finally이다. 이는 어떤 것을 시도(try)하다가 예외가 발생하면 이를 잡고(catch), 마지막으로(finally) 예외가 발생했건 발생하지 않았건 간에 작업을 정리한다는 것을 의미한다.
  • 항상 실행해야만 하는 코드는 finally 문에 작성해야 한다.

1.15     어노테이션

  • 어노테이션은 프로그램과 프로그램 요소(클래스, 메소드, 필드, 변수 등)에 대한 정보를 외부 도구가 쉽게 자동화할 수 있는 구조를 제공한다.
  • 어노테이션은 다른 제한자보다 먼저 선언되어야 한다.

1.16     패키지

  • 이름 충돌 문제는 패키지를 사용해도 완전히 해결할 수 없다. 
  • 이 문제는 오직 규약에 의해서만 해결할 수 있다.
  • 표준 규약은 패키지 이름을 현 조직의 인터넷 도메인 이름을 역순으로 시작하도록 작성하는 것이다.

1.17     자바 플랫폼

  • 자바는 이식성을 극대화할 수 있게 설계되었다.
  • 소스 코드는 자바 가상 머신, 즉 JVM에서 실행될 수 있는 자바 바이트 코드로 컴파일된다.
  • JVM은 런타임 시스템을 제공한다. 런타임 시스템은 JVM 자체 접근과 외부 접근을 지원한다.
728x90

댓글