본문 바로가기

공부기록용

[ 정보처리기사 ] 프로그래밍 언어(Java)

Java 프로그래밍 언어는 '객체 지향 프로그래밍 언어', C언어는 '절차적 프로그래밍 언어',

재사용성이 떨어지는 C언어의 단점을 보완하여 Java는 재사용이 용이하여 유지보수하기 좋게 만들어졌다.

(자바의 특징인) 객체 지향적인 경우 재사용성이 높아지고, 이로 인해 유지보수가 용이해진다.

 

객체 지향이란

현실세계에 존재하는 실체(Entity, 개체) 및 개념들을 객체라는 독립된 단위로 구성하고,

객체들이 메시지를 통하여 상호작용함으로써 전체 시스템이 운영되는 개념이다.

 

자바에서 클래스는 틀, 클래스를 통해서 객체가 만들어진다.

C언어에서의 함수가 자바에서의 메서드와 동일한 기능을 한다.

자바에서 클래스는(Class) 중요한 개념이다. 프로그래밍 언어인 자바는 객체간의 밀접한 협력과 결합에 용이하도록, 그런 구조를 지향하는? 특징을 갖고 있고,  그 객체의 기반이 클래스다. 여러 객체간 공통된 속성 및 기능을 모델링(추상화)한 것을 의미한다. 공통된 속성 및 연산(메서드·행위·기능 등 동일한 의미) 을 갖는 객체의 집합이라고도 표현한다. 클래스는 객체의 일반적인 타입이다. 인스턴스는 클래스로부터 만들어진 ( 클래스에 기반하여 생성된 ) 각각의 객체들을 의미한다.

 

클래스를 정의할 때

접근제한자 class 클래스이름 {...}

 

객체(Object)는 클래스의 인스턴스이며 객체들간의 상호작용은 메시지를 통해 이루어진다.

데이터는 객체가 가지고 있는 상태(속성, Attribute, 변수, 자료구조)를 의미하고,

연산자는 객체의 데이터를 처리하는 행위(메소드, Method, 동작, Operation, 함수, 프로시져)를 의미한다.

 

객체를 생성할 때 형식

클래스이름 변수이름 = new 클래스이름();

 

생성된 객체의 데이터와 연산자에 접근하는 방법은 객체이름.데이터 혹은 객체이름.연산자

이렇게 .(점)을 통해 객체가 갖고 있는 데이터 및 연산자에 접근할 수 있다.

 

자바에서 프로그램의 시작점은 public static void main(String[] args) {...} → main() 메소드다.

int[] a = {1,2,3,4,5,6}; 여기서 a는 객체다. 객체는 속성과 메소드를 갖고 있고, 배열이라는 객체는 배열의 크기(길이)를 알려주는 속성을 갖고 있다.  그래서 a.length는 a라는 배열의 크기(길이)를 반환하기 때문에 6이 반환 값이 된다.

Java 언어도 배열 첨자는 0부터 시작한다. ***첨자는 첨자 지정연산자인 [] (대괄호) 안에 실제로 작성된 숫자를 의미하고,

인덱스는 해당 요소가 실제 메모리 상에서 어떤 위치에 존재하는지, 실제 메모리에서 위치에 해당하는 값을 의미한다.

 

Java와 C언어간 다른 점

1. 배열 변수(객체) 선언

C언어에서 배열 참조변수를 선언할 때 int a[10]; → 데이터타입 변수(객체)이름 첨자지정연산자([첨자]);

Java에서 배열 선언시 int a[] = new int[10]; 혹은 int a[] = {1,2,3,4,5]; 와 같이 초기화하며 배열을 선언해도 된다.

***이차원 배열 선언시 int a[][] = new int[5][5];

 

초기화시 배열 크기는 생략이 가능하다(C언어, Java언어 공통)

 

배열의 크기(길이)를 알려주는 속성, 배열의 요소 개수를 구하는 length : 배열이름.length → 배열의 크기(길이)와 배열이 갖는 요소의 갯수는 다른가? 문자열의 길이를 구하는 메서드: 문자열객체이름.length();

 

2. while()

C언어에서는 while(1), while(true) 모두 작성가능,

Java언어에서는 while(true)만 작성가능하다.

 

3. for문

C언어와 Java언어 모두 for(초기식; 조건식[최종값]; 증감식) {...}; Java에서만 작성 가능한 향상된 for문 → for(int i: a); 여기서 a는 배열을 참조하는 참조변수다. 배열 a의 길이(크기)만큼 반복하겠다는 것을 의미

 

4. 사용자로부터 입력을 받는 함수

C언어의 경우 scanf("%d", &k);

Java언어의 경우

1) Scanner클래스를 import한다 → import java.util.Scanner; Scanner클래스는 사용자로부터 데이터를 입력받아 사용할 수 있도록하는 메서드 및 변수를 갖고 있다.

2) 스캐너 클래스로부터 객체를 만든다. 객체가 갖고 있는 변수 및 메서드를 사용하기 위해, 스캐너 객체가 갖는 변수 및 메서드를 사용하면 사용자로부터 데이터를 입력받을 수 있고, 사용할 수 있다. → Scanner sc = new Scanner(System.in);

3) 생성된 스캐너 객체가 갖는 메서드를 사용해서 사용자로부터 데이터를 입력받아 변수에 대입한다.

```

int k; // 사용자로부터 입력받는 데이터를 담을 변수, 그 데이터의 타입은 정수다.

k = sc.nextInt(); // 사용자로부터 정수형 데이터를 입력받아 해당 데이터를 반환하는 메서드 nextInt()

```

4) 스캐너 객체를 다 사용했으면 생성된 스캐너 객체를(자원을) 반납한다.

스캐너 객체의 주소 값을 저장하고 있는 참조변수를 메모리에서 해제한다.

sc.close();

 

5. 문자열

C언어의 경우 문자타입 배열을 이용, Java에서는 문자열 타입인 String을 사용한다.

 

접근제한자(Access Modifier)

 

- public: 모든 접근을 허용한다.- protected: 동일 패키지내의 클래스와 다른 패키지에 존재하지만 상속 관계(하위 클래스)에 있는 클래스에서도 접근이 가능하다.다른 패키지에 존재하는 클래스는 접근이 불가하지만 상속관계의 경우 하위클래스에서 접근이 가능하다.- default: 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 자신을 포함하는 패키지에서만 접근이 가능하다.

- private: 자신을 포함한 클래스에서만 접근이 가능하다. 외부에 있는 클래스의 접근을 차단한다.

 

클래스에 붙일 수 있는 접근제한자 종류: public, default

메서드/변수에 붙일 수 있는 접근제한자 종류: public, protected, default, private

 

상속(inheritance)은 하위 클래스는 상위 클래스의 메소드와 변수들을 정의하지 않고 바로 사용할 수 있다. 물려받는 것 → 재사용이 가능하다는 것을 의미. extends 키워드를 사용해서 상속 받는데, 형식은 하위클래스 extends 상위클래스 {...}

오버라이딩은 상속관계에서 발생한다. 하위 클래스에서 상위 클래스의 변수와 메소드를 물려받는데, 만약 하위 클래스에서 동일한 메소드를 호출하면서 하위클래스에게 더 적합한 기능을 작동할 수 있도록 만들려면 재정의하면 되는 것, 이를 오버라이딩이라고 한다.

오버라이딩(메소드 재정의)한 메소드는 부모클래스의 메소드보다 우선순위가 높아 호출시 하위클래스의 메소드가 호출된다.

 

오버로딩(Overloading)은 동일한 이름으로 여러 개의 메소드를 정의하는 것을 의미한다 → 재사용성↑

다형성(Polymorphism)은 메시지에 의해 객체가 연산을 수행하게 될 때, 하나의 메시지에 대해 각각의 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 것을 의미한다. 

 

객체는 속성과 메소드로 구성되어 있다. 데이터(속성)와 기능(메소드)을 하나의 객체로 묶어서 구성하는 것을 지향하는 것이 객체지향이다. 이렇게 묶어서 구성(코딩)하는 것을 캡슐화라고 하고, 캡슐화는 객체의 속성과 메소드를 다른 객체가 접근할 수 없도록 하기 때문에 메시지 수신에 의해 요구된 작업을 수행한다. 메시지(기능)를 통해 캡슐화된 객체에 간접적인 접근이 가능하다 → 캡슐화를 하는 방법은 클래스를 선언할 때 해당 클래스 및 클래스에 작성하는 속성 및 메소드에 접근제한자를 붙여서 처리한다. 캡슐화를 하는 이유는 정보(데이터)를 보호하거나 정보를 숨겨서 외부에서 직접적으로 접근하여 변경하지 못하게 하기 위함이다 → 프로그램 변경에 대한 오류의 파급효과가 적다. 

***메시지는 객체들 간의 상호작용을 하는데 사용되는 수단을 의미한다. 메소드를 의미하는 듯 하다.

***정보 은폐, 정보 은닉(Information Hiding): 객체는 다른 객체로부터 자신의 자료를 숨기고, 자신의 연산만을 통하여(getter, setter 메소드) (데이터 및 메소드에 대한) 접근을 허용하는 것을 의미한다.

 

참고

강의: 프로그래밍 언어 활용_권우석