1. Object(객체) 란?
  객체(Object)는 상태(state)와 동작(behavior)이 있는 소프트웨어 번들이다. 실세계 객체도 위의 2개의 특성(상태, 동작)으로 나뉜다. 
예를 들면, 강아지(dogs)는 상태(이름, 색, 배고픔 등)와 동작(짓는 것, 꼬리 흔들기, 달리기 등)이 있다.
자전거(bicycles)는 상태(현재 기어, 현재 속도 등)와 동작(기어 변경, 브레이크 밟기 등) 이 있다.

소프트웨어 객체

소프트웨어 객체는 실세계의 객체와 비슷하다. 소프트웨어 객체는 현재의 상태를 필드(fields or variables)라고 하고 동작을 메서드(methods or functions)라고 한다. 메소드는 객체의 내부 상태(internal state)를 표현하고 다른 객체들과 통신을 위해 사용된다. 객체의 내부상태를 숨기고 다른 객체들과 통신할 수 있는 메서드를 공개하는 것을 데이터 캡슐화(data encapsulation)라고 한다.

소프트웨어 객체로서 자전거 모델

소프트웨어 객체는 아래와 같은 이점이 있다.
 1) 모듈성(modularity)
 2) 정보은닉(information hiding)
 3) 코드 재사용(code re-use)
 4) 플러그 기능과 디버깅 용이(pluggablility and debugging ease)


2. Class(클래스) 란?
 실세계는 많은 개별 객체들로 이루어져 있다. 자전거를 예로들면 수천 종의 자전거가 있다. 하지만 각 자전거들은 동일한 설계도(blueprints)로 만들어지기 때문에 같은 구성요소들을 가지고 있다. 객체지향 개념에서는 위의 자전거를 객체 클래스의 인스턴스(instance of class of objects)라고 한다.
class는 개별적인 객체들을 만들 수 있는 설계도이다.

아래는 자전거 클래스 예제이다.

//자전거 클래스
class Bicycle { 
    //멤버변수들
    int cadence = 0;   //cadence field
    int speed = 0;      //speed field
    int gear = 1;        //gear field
    
    //케이던스 메소드
    void changeCadence(int newValue) { 
         cadence = newValue; 
    } 
    //기어변경 메소드
    void changeGear(int newValue) { 
         gear = newValue; 
    } 
    //속도변경 메소드
    void speedUp(int increment) { 
         speed = speed + increment;    
    } 
    //브레이크 메소드
    void applyBrakes(int decrement) { 
         speed = speed - decrement; 
    } 
    //상태 출력 메소드
    void printStates() { 
         System.out.println("cadence:" + 
             cadence + " speed:" +  
             speed + " gear:" + gear); 
    } 
}



//자전거 클래스를 실행시킬 수 있는 데모클래스
class BicycleDemo { 
    //JVM이 main() 메소드를 찾아 실행시킨다.
    public static void main(String[] args) { 
        // Create two different  
        // Bicycle objects 
        Bicycle bike1 = new Bicycle(); 
        Bicycle bike2 = new Bicycle(); 

        // Invoke methods on  
        // those objects 
        bike1.changeCadence(50); 
        bike1.speedUp(10); 
        bike1.changeGear(2); 
        bike1.printStates(); 

        bike2.changeCadence(50); 
        bike2.speedUp(10); 
        bike2.changeGear(2); 
        bike2.changeCadence(40); 
        bike2.speedUp(10); 
        bike2.changeGear(3); 
        bike2.printStates(); 
    } 
}



<결과>
cadence:50 speed:10 gear:2 
cadence:40 speed:20 gear:3

3. Inheritance(상속) 란?
 공통 특성들을 부모 클래스(super class)로 모으고 부모 클래스의 특성들을 상속(inherit)받아 각 서브 클래스(sub class)를 구현하는 것을 상속이라고 한다.

자전거 객체 상속

아래는 상속 관련 예제이다. Java에서는 extends 키워드를 사용하여 상속을 구현한다.

class MountainBike extends Bicycle {

    // new fields and methods defining 
    // a mountain bike would go here

}

4. Interface(인터페이스) 란?
 객체들은 외부로 노출되는 메소드를 통해 다른 객체들과 상호작용을 한다. 이런 메서드들은 외부 세계와 객체의 인터페이스를 형성한다. 예를 들면 텔레비전의 전원 버튼은 TV와 사람과 연결해 주는 인터페이스이다.
가장 일반적인 인터페이스는 관련 메소드들만 정의하고 실제 어떻게 동작하는지는 비어있다. 각 객체에서는 비어있는 인터페이스를 구현하여 해당 인터페이스가 어떻게 동작하는지를 정의한다.

아래는 인터페이스 관련 예제이다. Java에서 인터페이스는 implements 키워드를 통해 구현한다.

//Bycycle 인터페이스 정의
interface Bicycle {

    //  wheel revolutions per minute
    void changeCadence(int newValue);

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);
}


//Bicycle 인터페이스 구현
class ACMEBicycle implements Bicycle {

    int cadence = 0;
    int speed = 0;
    int gear = 1;

   // The compiler will now require that methods
   // changeCadence, changeGear, speedUp, and applyBrakes
   // all be implemented. Compilation will fail if those
   // methods are missing from this class.

    void changeCadence(int newValue) {
         cadence = newValue;
    }

    void changeGear(int newValue) {
         gear = newValue;
    }

    void speedUp(int increment) {
         speed = speed + increment;   
    }

    void applyBrakes(int decrement) {
         speed = speed - decrement;
    }

    void printStates() {
         System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
    }
}

5. Package(패키지) 란?
 패키지는 관련된 클래스와 인터페이스 집합들을 관리하는 네임스페이스(namespace)이다. 개념적으로는 폴더(디렉토리)와 유사하다. 유사한 기능을 하는 클래스와 인터페이스들을 패키지로 구성하여 유지하는 것이 차후에도 관리하기가 편하다.

 

 

참조: https://docs.oracle.com/javase/tutorial/java/concepts/index.html

 

1. Java Technology
 Java는 프로그래밍 언어이자 플랫폼입니다.

 1) Java 프로그래밍 언어
   Java는 아래 용어들로 특징지을 수 있는 고급언어입니다.
   - Simple
   - Architecture neutral
   - Object oriented
   - Portable
   - Distibuted
   - High performance
   - Multithreaded
   - Robust
   - Dynamic
   - Secure
  
 Java 소스코드는 .java 파일로 작성하며, javac로  소스코드를 컴파일하면 .class 파일이 생성됩니다. 해당 .class파일에는 컴파일한 프로세서에 대한 네이티브 코드가 포함되지 않고 JVM(Java Virtual Machine)이 해석할 수 있는 바이트코드가 포함됩니다. Java launcher는 JVM과 함께 만든 프로그램을 실행합니다.

Java 프로그램 개발 개요

 아래와 같이 컴파일러에 의해 만들어진 .class 파일은 여러 운영 체제에 설치되어 있는 JVM에서 대부분 동일하게 수행됩니다.

여러 운영체제에서 JVM을 통해 같은 프로그램이 실행됨


2) Java 플랫폼
 플랫폼(flatform)은 프로그램이 수행되는 하드웨어나 소프트웨어 환경입니다. Microsoft Windows, Linux, Solaris OS, Mac OS 가 대표적인 플랫폼입니다. 대부분의 플랫폼은 운영체제와 기본 하드웨어의 조합으로 설명할 수 있습니다.
Java 플랫폼은 다른 하드웨어 기반 플랫폼에서 실행되는 소프트웨어 플랫폼입니다.
 
Java 플랫폼은 JVM(Java Virtual Machine) 과 Java API(Application Programming Interface)를 포함하고 있습니다.
JVM은 Java 플랫폼의 기반으로 서로 다른 하드웨어에서 실행됩니다.
API는 프로그램에 바로 적용 가능한 유용한 기능들의 모음입니다. 해당 API는 class와 interface의 library로 묶여 있고 이것을 패키지(package)라고 합니다.

Java platform 개요

 Java 플랫폼은 네이티브 코드보다 느릴 수 있지만, 컴파일러와 JVM 기술의 발전으로 네이티브 코드에 가까운 성능을 제공합니다. 


2. Java로 할 수 있는 것
 1) Development Tools
   : 프로그램을 compiling, running, monitorning, debugging, documenting 할 수 있다.
 2) API
   : networking, security, XML generation, database access 등이 있다.
 3) Deployment
   : Java Web Start, Java Plug-in을 통해 배포할 수 있다.
 4) UI Toolkits
   : JavaFX, Swing, Java 2D로 GUI를 만들 수 있다.
 5) 통합 라이브러리
   : Java IDL API, JDBC API, JNDI API, Java RMI 등이 있다.


3. Java "Hello world"
 새로운 프로그래밍 언어를 배울때 관례적으로 접하는 "Hello World" 출력 프로그램을 Java로 작성해 보자.

/**
 * The HelloWorldApp class implements an application that
 * simply prints "Hello World!" to standard output.
 */
class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}

 위처럼 HelloWorld라는 클래스를 정의하고 "public static void main(String [] args)"이라는 메서드를 작성한다. 프로그래밍 언어에선 "main()" 메서드는 조금 특별한데 모든 프로그램의 시작이 되는 부분이다.

JVM이 "main()" 메서드를 읽어들여 프로그램을 시작한다. public인 어디서든지 접근 가능하다는 뜻이고 static은 프로그램이 시작될 때부터 메모리에 올라간다는 뜻이다. 그리고 void는 JVM이 받는 리턴 값이 없다는 뜻이고 "String [] args"는 프로그램이 시작 시 입력받을 수 있는 인자가 저장되어 있는 곳이다.
"System.out.println()" 메서드는 Java에서 제공하는 기본 메서드로 콘솔창에 출력한다는 뜻이다.

간단한 프로그램이기 때문에 따로 개발환경이 설정되어 있지 않으면 아래의 온라인 컴파일에서 테스트할 수 있다.
https://www.tutorialspoint.com/compile_java_online.php

 

출처: https://docs.oracle.com/javase/tutorial/getStarted/intro/index.html

오라클 자바 튜토리얼(https://docs.oracle.com/javase/tutorial/index.html)이 있어서 소개합니다.
해당 사이트에 들어가서 살펴보니 JAVA에 대한 기본적인 내용 및 심화 내용들이 있습니다.
그동안 책이나 인터넷 검색을 통해 JAVA를 배웠는데.. 정작 오라클 홈페이지의 튜토리얼이 있다는 것을 보고 많은 생각이 들었습니다.
다른 개발언어나 프레임워크, 오픈소스들도 만든 곳의 튜토리얼을 보면 많은 도움이 됩니다.

다음은 튜토리얼 사이트에 있는 목록입니다.
1. JAVA 기본
  1) 시작
  2) 자바 언어 배우기
  3) 클래스 (class) 
  4) 컬렉션 (collections)
  5) Date-Time APIs
  6) 배포 (deplyment)
  7) Java Certifiation

2. JAVA GUI
  1) Swing
  2) JavaFX

3. JAVA 심화
  1) Custom Networking
  2) Extendsion Mechanism
  3) Full-Screen Exclusive Mode API
  4) Generics
  5) Internationalization
  6) JavaBeans
  7) JDBC Database Access
  8) JMX (Java Management Extensions)
  9) JNDI (Java Naming and Directory Interface)
 10) JAXP (Java API for XML Processing)
 11) RMI (Remote Method Invocation API)
 12) Reflection
 13) Security
 14) Sound
 15) 2D Graphics
 16) Sockets Direct Protocol

위의 내용들을 기반으로 Java에 대한 내용들을 정리할 예정입니다.

출처: https://docs.oracle.com/javase/tutorial/index.html