1. Object-Oriented Programming(객체 지향 프로그래밍)


 - 현실 세계를 모델링하여 소프트웨어도 객체 단위로 개발하는 방법이다.

 - 즉, 자동차도 부품이 있어야 조립되듯이 특정한 기능을 하는 소프트웨어 객체들을 조합하여 자기가 원하는 기능을 구현하는 것을 의미한다.

 - 절차 지향 프로그래밍처럼 데이터보다 함수(문제 해결 절차)에 집중하는 것이 아니라, 데이터와 알고리즘을 함께 고려하여 하나의 객체로 묶어서 하는 방법을 의미한다.


* 자바는 객체 지향 기법을 지원하지만, 절차 지향 기법을 지원하지 않는 것은 아니다. 실제 객체의 내부를 설계할 때 절차 지향 프로그래밍을 이용한다.



2. 객체 지향 프로그래밍의 특징


 - 캡슐화(Encapsulation) : 관련된 데이터와 알고리즘(코드)이 하나로 연관되어 잘 정리되어 있는 것으로 데이터와 알고리즘을 캡슐에 넣어서 포장한다는 것을 의미한다. 자바에서는 이 때 이 캡슐을 클래스라고 부른다.


 - 정보 은닉(Information hiding) : 캡슐화는 내부의 데이터를 캡슐로 보호하는 역할을 한다. 즉, 캡슐화를 통해 데이터를 감추고 외부 세계와의 상호작용은 메소드(함수)를 통해 이루어진다.


 - 상속 : 기존의 코드를 재활용하기 위한 기법으로 이미 작성된 클래스(부모 클래스)를 이어받아서 새로운 클래스(자식 클래스)를 생성하는 기법이다. 즉, 공통적으로 쓰이는 변수나 함수가 있다면, 하나의 클래스로 지정해놓고 세부적으로 변수나 함수를 덧붙여서 그 클래스를 포함하는 새로운 클래스를 작성할 때 사용된다.

예를 들어, Vehicle 이 부모 클래스이고, 나머지 Car, Truck, Bus의 경우 Vehicle의 속성을 물려받은 자식 클래스에 해당한다.


  ┌ Car

ex) Vehicle ─┼ Truck

  └ Bus



 - 다형성 : 객체가 구현한 기능(동작)이 상황에 따라 바뀌는 것을 의미한다. 예를 들어 Animal 클래스에서 speak() 라는 메소드(함수)가 있다면, Animal 클래스를 상속받은 Dog 클래스와 Cat 클래스가 있을 때 speak() 라는 하나의 메소드로 두 가지 동작을 구현할 수 있게 된다.



3. Class(클래스)


 - 객체를 찍어내는 틀 또는 설계도

 - 클래스로부터 만들어지는 각각의 객체를 그 클래스의 인스턴스(instance)라고 한다.

 - 객체를 만드는 과정을 인스턴스화라고한다.

 - 데이터와 알고리즘으로 이루어진다. 

 - 변수(필드)와 함수(메소드 or 생성자)의 기능을 정의한다.

 - 객체는 클래스로부터 new 연산자를 통해 생성되며, new 연산자는 힙(heap) 영역에 객체를 생성시킨 후, 객체의 주소를 리턴한다.

 


4. Object(객체)


 - 클래스를 선언하여 변수와 함수를 상태와 동작으로 구현한 객체를 생성한다.

 - 객체의 상태(state)란 객체의 속성을 의미하고, 객체의 동작(behavior)또는 행동은 객체가 취하는 기능(행위)를 의미한다.

 - 객체 안의 변수를 필드(field)라고 하고, 객체 안의 함수를 메소드(method)라고 부른다. 즉 객체는 필드와 메소드로 이루어져있다.

정리하자면, 필드란 객체의 속성을 나타내고, 메소드란 객체의 동작을 나타낸다.

 - 객체는 힙(heap)이라는 메모리 공간에서 생성된다.

 - 객체의 소멸 : 자바의 실행 환경은 사용이 끝난 객체를 스스로 판별하여 소멸시키고 그 객체가 가지고 있던 자원을 시스템에 반납시킨다. 예시로 객체를 가리키는 참조형 변수가 하나도 사용되지 않거나 소멸되거나 혹은 프로그램에서 의도적으로 null값을 설정했다면, 객체의 사용이 끝났다고 판단할 수 있다.



5. 클래스 선언 시 작성 규칙


 - 하나 이상의 문자로 이루어져야 한다. ex) Car, Sport

 - 첫 번째 글자는 숫자가 올 수 없다. ex) Car, 3Car(X)

 - '$', '_'외의 특수문자는 사용할 수 없다. ex) $Car, _Car, @Car(X)

 - 자바 키워드는 사용할 수 없다. ex) int(X), for(X)



6. 클래스의 구성멤버


 - 필드(Field) : 객체의 고유 데이터, 부품 객체, 상태 정보(속성)을 저장한다. 

  • 선언 형태는 변수(variable)와 비슷하나, 필드를 변수라고 부르진 않는다.
  • 필드는 객체에 소속도니 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않는다.
  • 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸된다. 그러나 필드는 모든 클래스 내부에서 사용되며, 객체가 소멸되어야 객체와 함께 사라진다.
  • 필드의 선언은 생성자와 메소드 사이나 앞과 뒤에서 존재할 수 있다. 단, 생성자와 메소드 블록 내부에 선언된 것은 필드가 아니라 로컬 변수(local variable)이다.
  • 필드도 변수처럼 자료형(type)이 존재하며, 참조형에는 대표적으로 배열, 클래스, 인터페이스가 올 수 있다.


 - 생성자(Constructor)클래스로부터 new 연산자를 사용하여 객체가 생성될 때 가장 먼저 호출되는 특별한 중괄호 블록(block)이다.

  • 생성자의 역할은 객체 생성 시 초기화를 담당한다.
  • 쉽게 말해서 가장 먼저 실행되는 메소드로 볼 수 있다.
  • 형태는 메소드와 다르다. 생성자의 이름은 무조건 클래스의 이름과 일치해야 하고 리턴타입이 없다.
  • 모든 클래스는 생성자가 반드시 존재하며, 매개변수를 달리하는 생성자 여러 개를 선언할 수 있다. 이것을 생성자 오버로딩이라고 한다.
  • 만약 생성자 선언을 생략하면, 컴파일러는 중괄호 블록 내용이 비어있는 기본 생성자(Default Constructor)를 바이트 코드에 추가한다.


 - 메소드(Method) : 객체의 동작에 해당하는 중괄호 블록(block)이다. 

  • 형태는 C언어의 함수와 비슷하며, 메소드는 호출되면 블록 안의 모든 코드들이 일괄적으로 실행된다. 
  • 메소드의 역할은 객체 간의 데이터 전달의 수단으로 사용된다. 
  • 외부로부터 매개값을 받거나 실행 후 어떤 값을 리턴할 수 있다.
  • 클래스 내부에 매개변수가 다르나 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩(overloading)이라고 한다.
  • 메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다. 리턴 타입은 무관하다.



7. 객체의 필드와 메소드 접근


 - 객체의 외부에서 객체에 포함된 멤버(필드와 메소드)를 참조(접근)하려면 도트 연산자(.)를 사용한다.

 - ex) Car 객체의 speed라는 필드를 외부의 객체에서 접근할 때,


class 외부클래스 {

//객체는 참조형 변수로 선언된다. 객체의 주소를 가르키기 때문이다.

Car myCar = new Car(); //객체는 무조건 new 연산자를 통해 생성된다. 대입연산에 관하여 참조형 변수와 기본형 변수는 다르다.


myCar.speed = 100;


}

 - 객체 지향의 개념에서 보면 필드를 외부에서 직접 접근하는 것은 바람직하지 않다. 되도록 객체 내의 필드는 메소드를 통해서 간접적으로 접근하도록 클래스를 설계해야한다.



8. 문자열 객체


 - 문자열은 프로그램에서 많이 자료형으로 문자들의 나열이다. 결론적으로, 자바에서는 문자열을 저장할 수 있는 기본 자료형이 없다. 즉, 문자열은 객체로 취급된다.

 - 문자열은 String 클래스를 이용하여 객체로 생성된다.

 아래의 문장은 "Hello World!" 라는 문자열을 가진 String 클래스의 객체를 생성한 것이다. 이 때, s는 생성된 객체의 주소를 가리키는 참조형 변수이다.


String s = new String("Hello World!); //선언과 동시에 초기화


 - 문자열은 자주 사용되므로 new 연산자를 사용하지 않고 문자열 상수로 표기해도 자동적으로 객체가 생성된다.


String s = "Hello World!";


 - 객체의 메소드 호출 : 도트 연산자(.)를 사용한다.


String s = new String("Hello World!");

int size = s.length(); // 여기서 length()는 String클래스에서 제공하는 메소드이다.


 - 참조 변수끼리의 대입 연산


String s1 = "I am very strong";

String s2 = "You are good boy";


s2 = s1; //객체의 번지를 대입.


여기서 s1과 s2가 가리키고 있던 객체는 서로 다르다. 그러나 아래의 s2에 s1이 가리키는 객체의 번지를 대입하면서 s1과 s2는 같은 String 객체를 가리킨다. 



9. Garbage Collection(쓰레기 수집)


 - 자바 실행 환경이 해당 객체가 더 이상 사용되지 않는 다고 판단되면 소멸시키는 기능

 - stop-the-world : 쓰레기 수집(이하 GC)를 실행하기 위해 자바 가상 기계가 애플리케이션 실행을 멈추는 기능이다. 

stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 작업을 모두 중단한다. 그리고 GC작업이 종료된 후에 나머지 쓰레드가 작업을 다시 시작한다.(여기서 쓰레드는 프로그램의 실행흐름을 의미한다.) 어떤 경우라도 이 기능은 무조건 발생한다. 자바에서는 소스 코드에서 메모리를 확실하게 지정하거나 해제하지 않는다. 간혹 명시적으로 해제하는 방법은 해당 객체를 null로 지정하거나 System.gc()메소드를 호출하는 방법이 있으나, 후자의 경우 시스템의 성능에 영향을 크게 주기 때문에 되도록 사용하지 않는 것을 추천한다. 아무튼 자바에서는 개발자가 메모리를 확실히 해제하지 않기 때문에 쓰레기 수집 기능이 객체를 판별하여 소멸시키는 작업을 하는 것이다.






[자료 구조의 형태에 따른 분류]


1. 단순 구조 : 기본자료형에 해당


2. 선형 구조 : 자료간의 관계가 1:1로 고정되어 있는 구조 

 - 리스트(순차 리스트)는 자료의 논리적인 순서와 기억장소에 저장되는 물리적인 순서가 일치하는 구조이다.

 - 연결 리스트는 물리적인 순서에 상관없이 저장되어 있는 주소를 사용하여 논리적인 순서를 갖는 구조이다.

 - 스택, 큐, 덱은 자료의 삽입 및 삭제 위치에 대하여 제한적인 조건을 가지는 구조이다.


3. 비선형 구조 : 자료간의 선형구조가 아닌 계층(Hierarchical) 구조나 망(Network) 구조를 갖는다.


4. 파일 구조 : 서로 관련 있는 필드들로 구성된 레코드의 집합인 파일에 관한 것으로 보조기억장치에 데이터가 직접 기록된다.


1. 패러다임

- 객체 지향 프로그래밍(Object-Oriented Programming)

- 구조적 프로그래밍(Structured Programming)

- 절차적 프로그래밍(Imperative Programming)


2. JRE : Java Runtime Environment 

- 자바 프로그램을 실행하기 위한 라이브러리, 자바 가상 기계, 기타 컴포넌트들을 제공한다.

- 자바 프로그램을 단순히 실행만 하고 개발은 하지 않는 일반인들을 위한 환경이다.


3. JDK : Java Development Kit (자바 개발 도구)

- JRE에 추가로 자바 프로그램을 개발하는데 필요한 컴파일러, 디버거와 같은 명령어행 개발 도구를 추가한 것이다.


4. 오류

- 컴파일 오류 : 컴파일 시에 발견되는 오류


- 구문 오류(Syntax error) : 문법 규칙에 어긋날 경우 생기는 오류


- 의미 오류(Semantic error) : 계산식에서 호환되지 않는 서로 다른 타입의 데이터에 대해 계산을 시도할 경우 발생하는 오류


- 논리 오류 : 프로그램이 실행되어도 의도하지 않는 결과를 발생하는 오류. 디버깅(Debuugging)을 통해 논리 오류를 찾고 수정한다.


- 실행 오류 : 프로그램이 실행되는 도중에 발생하는 오류. 자바에서는 예외(Exception)를 사용하여 실행 오류를 처리한다.



5. Exception(예외)의 종류와 발생원인


 Exception 종류

발생 원인 

ClassNotFoundException

클래스를 발견하지 못함

CloneNotSupportedException

Cloneable 인터페이스 미구현

IllegalAccessException

클래스 접근을 못함

InstantiationException

추상 클래스나 인터페이스 인스턴화

InterruptedException

쓰레드가 중단 되었을때

NoSuchFieldException

지정된 필드가 없을때

NoSuchMethodException 

지정된 메소드가 없을때

(IOException) CharConversionException 

문자 변환에서 예외가 발생했을때

(IOException) EOFException

파일의 끝에 도달했을때

(IOException) FileNotFoundException

파일을 발견하지 않았을 때

(IOException) InterruptedIOException

입출력 처리가 중단되었을 때

(IOException) (ObjectStreamException) InvalidClassException

클래스 내부의 serialize 처리 문제 발생

(IOException) (ObjectStreamException) InvalidObjectException

 serialize 오브젝트에서 입력 검증 실패

(IOException) (ObjectStreamException) NotActiveException

스트림 환경이 Active하지 않는데 메소드를 호출한 경우

(IOException) (ObjectStreamException) NotSerializableException

오브젝트를 serialize할 수 없을 때

(IOException) (ObjectStreamException) OptionalDataException

오브젝트 읽을 때 예상밖의 데이터가 있을 경우

(IOException) (ObjectStreamException) StreamCorruptedException

읽은 데이터 스트림이 파손되어 있을때

(IOException) (ObjectStreamException) WriteAbortedException

기록중 예외 발생한 스트림 읽은 경우

(IOException) SyncFailedException

FileDescriptor.sync() 호출 실패 시

(IOException) UnsupportedEncodingException

지정된 문자 부호화 형식 지원안할 때

(IOException) UTFDataFormatException

부정한 UTF-8방식의 문자열 만날 시

(RuntimeException) ArithmeticException

제로제산 등의 산술 예외 발생 시

(RuntimeException) ArrayStoreException

배열에 부정한 형태의 오브젝트 저장

(RuntimeException) (IllegalArgumentException) IllegalThreadStateException

쓰레드가 요구를 처리하기에는 부적합한 상태일 때

(RuntimeException) (IllegalArgumentException) NumberFormatException

부적절한 문자열을 수치로 변환할 때

(RuntimeException) IllegalMonitorStateException

모니터 상태가 부정일때

(RuntimeException) IllegalStateException

메소드가 요구를 처리하기에는 부적합한 상태일 때

(RuntimeException) (IndexOutOfBoundException) ArrayIndexOutOfBoundsException

범위 밖의 배열 첨자 지정 시

(RuntimeException) (IndexOutOfBoundException) StringIndexOutOfBoundsException

범위 밖의 String 첨자 지정시

(RuntimeException) NegativeArraySizeException

배열 크기를 음수로 지정한 경우

(RuntimeException) NullPointerException

null 오브젝트에 접근한 경우

(RuntimeException) SecurityException

보안 위반

(RuntimeException) UnsupportedOperationException

지원하지 않는 메소드 호출

 Error 종류

생원인 

(LinkageError) ClassCircularityError

클래스 초기화중에 순환 참조를 검출시

(LinkageError) (ClassFormatError) UnsupportedClassVersionError

JVM이 지원되지 않는 버전의 클래스 파일을 읽고자 할때

(LinkageError) ExceptionInInitializerError

정적 이니셜라이저로 예외가 발생

(LinkageError) (IncompatibleClassChangeError) AbstracMethodError

추상 메소드를 호출했을때

(LinkageError) (IncompatibleClassChangeError) IllegalAccessError

접근 불가능한 메소드와 필드 사용 시

(LinkageError) (IncompatibleClassChangeError) InstantiationError

추상클래스나 인터페이스 인스턴스화

(LinkageError) (IncompatibleClassChangeError) NoSuchFieldError

지정한 필드가 존재하지 않을 때

(LinkageError) (IncompatibleClassChangeError) NoSuchMethodError

지정한 메소드가 존재하지 않을 때

(LinkageError) NoClassDefFoundError

클래스 정의가 발견되지 않았을 때

(LinkageError) UnsatisfiedLinkError

클래스에 포함된 링크 정보를 해결하지 못할 때

(LinkageError) VerifyError

클래스 파일안에 부적절한 부분이 있을때

ThreadDeath

쓰레드가 정지해야만 한다는 의미

(VirtualMachineError) InternalError

내부 에러

(VirtualMachineError) OutOfMemoryError

메모리부족으로 메모리를 확보 못함

(VirtualMachineError) StackOverflowError

스택 오버 발생

(VirtualMachineError) UnknownError

심각한 예외 발생


[출처] http://silverbullet.tistory.com/entry/Exception%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EB%B0%9C%EC%83%9D%EC%9B%90%EC%9D%B8




대게 프로그램에서 각 문장들은 위에서 아래로 순차적으로 실행된다. 이 때 제어문(Control Statement)을 사용하여 각 문장들의 실행 순서를 변경할 수 있다. 아래는 프로그램에서 나타나는 3가지의 제어 구조이다.



< 순차 구조 >


◆ ─> 『문장 A』 ─> 『문장 B』 ─> 




< 선택 구조 >


   ┌  true ─> 『문장 A』 ─┐

 ─> 【조건식】  ┤         

   └ false ─> 『문장 B』 ─┘




반복 구조 >


        ┌ false ───> 

 ┬> 【조건식】 ─ true ─> 『문장 A』 ┐

  └─<




제어문은 크게 조건문과 반복문으로 나뉘어 진다. 조건식의 산출값은 true 나 false 가 나오게 해야 한다.



▶ 조건문 : 조건에 따라 여러 개의 실행문(실행 경로) 중 하나(특정 경로)를 선택해야 하는 경우


1. if 문


# 기본 형태


if ( 조건식 )

문장1; // 조건식이 true 면 실행



# 조건에 따라 두 개 이상의 문장이 실행되어야 할 경우


if ( 조건식 ) {

문장1; // 조건식이 true 면 실행

문장2;
문장3;
}


# 중첩 if 문


if ( 조건식1 )
if ( 조건식2 ) // 조건식1이 true 면 실행 

문장1; // 조건식2가 true 면 실행



if ( 조건식1 ) {
if ( 조건식2 ) { // 조건식1이 true 면 실행

문장1; // 조건식2가 true 면 실행

문장2;

if ( 조건식3 ) { 

문장3; // 조건식3이 true 면 실행

}

}

}


2. if-else 문


# 기본 형태


if ( 조건식 )

문장1; // 조건식이 true 면 실행

else

문장2; // 조건식이 false 면 실행



# 조건에 따라 두 개 이상의 문장이 실행되어야 할 경우 - 복합문(Compound Statement)


if ( 조건식 ) {

문장 1; // 조건식이 true 면 실행

문장 2; // 이러한 문장 그룹핑을 복합문 또는 블록(block)이라고 한다.

}

else {

문장 3; // 조건식이 false 면 실행

문장 4;
}


# 간단한 조건문일 경우 조건 연산자로도 표현이 가능하다.


System.out.println( x > 50 ? "x = 50" : "x != 50");


# 중첩 if-else 문


if ( 조건식1 ) {

문장 1; // 조건식1이 true 면 실행


if ( 조건식2 ) {

문장 2; // 조건식2가 true 면 실행

문장 3;

}

else {

문장 4; // 조건식2가 false 면 실행

문장 5;
}

}

else {

문장 3; // 조건식1이 false 면 실행

문장 7;
}


3. switch 문


# switch 문은 여러 개의 실행문 중 해당 조건에 맞는 실행문을 선택한다.


# 기본 형태


number = 5;


switch( number ) { // switch 안의 괄호(수식)는 문자나 문자열도 가능하다.

case 1 :

문장1;

break; // break; 문장은 빠져나가는 것으로 없을 경우 아래의 case 도 실행된다.

case 2 :

문장2;

continue; // continue; 문장은 다시 switch(수식) 문으로 돌아가는 것으로 break; 문장과는 다르다.

case 3 :

문장3;

break;

default : // switch 안에 수식의 결과가 어떤 case 문에도 해당되지 않는 경우에 실행된다. 

문장4; // 예상치 못한 결과에 대비하여 default문은 작성하는 것이 좋다. (작성 여부는 자유)

break;




▶ 반복문 : 어떤 조건이 유지되거나 정해진 횟수만큼 문장을 반복(Looping)해야 하는 경우


1. while 문


# 조건식이 참이면 블록을 반복적으로 실행한다.


while ( 조건식 ) {

반복문장;

}


# 무한 루프


while (true) {

문장1;

문장2;

문장3;

}



2. do-while 문


# 문장을 우선 실행한 뒤에 조건식을 검사한다.


# 기본 형태 - 끝에 세미콜론(;) 필수.


do {

반복문장1; // 처음에는 무조건 실행!

} while ( 조건식 );



3. for 문


# 정해진 횟수만큼 반복할 때 사용된다.


# 기본 형태

 - 초기식 → 조건식 ─ true → 문장1; → 문장2; → 증감식 → 조건식 ─ true → 문장1; → 문장2; → 증감식 

→ 조건식 ─ false → 반복문 종료


for ( 초기식(1) ; 조건식(2) ; 증감식(5) ) { // 괄호 안은 처음 루프돌 때 순서입니다.

문장1;  (3)

문장2;  (4)

}


# 예제


for ( int i = 0; i < 5; i++ ) {

System.out.println(" i 의 값은 : "+ i);

}


# 무한 루프


for ( ; ; ) {

문장1;

문장2;

}

+ Recent posts