기본문법 활용하기 -5(자료형, 클래스 등)

2022. 9. 1. 17:36정처기(필기)/프로그래밍언어활용

(1) 사용자 정의 자료형의 개념

- 사용자 정의 자료형은 사용자가 상황에 맞게 기존 자료형들을 조합해서 만드는 자료형이다.

- 사용자 정의 자료형에는 열거체, 구조체가 있다.

 

(2) 사용자 정의 자료형 종류

1. 열거체

- 열거체는 서로 연관된 정수형 상수들의 집합이다.

- 정수형 상수에 이름을 붙여서 코드를 이해하기 쉽게 해준다.

- C에서는 멤버에 초깃값을 설정하지 않으면 9부터 차례대로 할당된다.

 

ex)

enum 열거체명 {

멤버1,

멤버2,

.......

}

 

 

2. 구조체

- 구조체는 사용자가 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 자료형이다.

- 자바, 파이썬에서는 지원하지 않는다.

 

ex)

struct 구조체명 {

자료형 변수명1;

자료형 변수명2;

......

 

 

}

 

① 구조체 변수와 구조체 포인터

- 구조체는 일반 구조체 변수로 접근할 때는 .으로 접근하고, 구조체 포인터로 접근할 때는 ->로 접근한다. 

 

② 1차원 구조체 배열과 1차원 구조체 포인터

- 1차원 구조체 배열에서 배열명만 단독으로 사용할 경우 1차원 구조체 포인터와 동일하다.

- 1차원 구조체 배열일 때 배열명[요소], 변수명 형태, (*(배열명+요소)).변수명, 배열명 -> 변수명 형태, (배열명 + 요소) -> 변수명 형태로 값을 가리킨다.

- 1차원 포인터일 때 포인터[요소].변수명 형태, (*(포인터+요소)).변수명, 포인터->변수명 형태, (포인터+요소) -> 변수명 형태로 값을 가리킨다. 

 

 

(3) main 함수

- main 함수는 프로그램이 실행하는 모든 프로그램의 시작점이다.

- main 함수에 있는 명령어를 실행한다.

 

1. C 언어의 main 함수

타입 main(파라미터) {

명령어;

}

-> void main()일 경우 return 반환값;을 사용하지 않고, int main()일 경우 return 반환값;을 명시해주어야 한다.

 

2. 자바의 main 함수

public static void main(String[] args) {

명령어;

}

 

 

(4) 사용자 정의 함수 

- 사용자 정의 함수는 사용자가 직접 새로운 함수를 정의하여 사용하는 방법이다. 

 

▼ C, 자바에서 사용하는 사용자 정의 함수

반환_데이터_타입 함수명(데이터_타입_변수명, ...) {

명령어;

return 반환값;

}

 

▼ 파이썬에서 사용하는 사용자 정의 함수

def 함수명(변수명, ...) : 

명령어

return 반환값

 

 

(5) 함수 포인터

- 함수 포인터는 함수의 주소를 저장하고, 해당 주소의 함수를 호출하는 데 사용하는 포인터이다.

 

ex)

리턴타입 (*함수_포인터)(함수 파라미터);

 

 

(6) 매개변수 전달방법

- 매개변수 전달은 함수가 필요로 하는 값을 매개변수로 만들면 함수를 호출하는 쪽에서 매개변수를 사용하여 해당 함수에 변수의 값, 변수의 주솟값을 전달하는 방식이다. 

 

1. 매개변수 종류

 

구성요소 설명
전달인자
(Argument)
실 매개변수로도 불림
함수가 함수 호출하는 쪽에서 전달받는 변수의 값 또는 변수의 주소값
매개변수
(Parameter)
형식 매개변수로도 불림
함수를 호출하는 쪽에서 전달하는 변수의 값 또는 변수의 주소값

 

#include <stdio.h>
int fn(int x, int y) {		//<- 전달인자(Arguments)
	........
}


void main() {
	int i, j;
    ...
    fn(i, j);    //->매개변수(Parameters)

}

 

2. 매개변수 전달방법

  • Call by Value : 변수의 값을 넘겨주고, 이 값은 새로운 공간에 할당되어 사용하는 방식, 형식 매개변수의 어떠한 변화도 실 매개변수에 아무런 영향을 미치지 않음
  • Call by Referenct : 변수의 값이 아닌 변수가 사용 중인 메모리 공간의 주소를 넘겨주는 방식, 실 매개변수의 주소를 형식 매개변수로 보냄

 

ex)

[1] : Call by Value

#include <stdio.h>
int fn(int x, int y) {
	.....
}

void main() {
	int i, j;
    ...
    fn(i, j);
}

 

[2] :  Call by Reference

#include <stdio.h>
int fn(int x, int* y) {
	...
}

void main() {
	int i, j;
    ...
    fn(&i, &j);
}

 

 

3. 재귀 함수

- 재귀 함수는 함수 자신이 자신을 부르는 함수이다. 

 

 

(7) 클래스

- 클래스는 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 틀이다.

- C언어는 명령형 프로그래밍으로 클래스를 지원하지 않는다.

 

1. 접근 제어자

- 접근 제어자는 지정된 클래스, 변수, 메소드를 외부에서 접근할 수 있도록 권한을 설정하는 기능이다. 

 

▼접근 제어자 종류

종류 설명
public 외부의 모든 클래스에서 접근이 가능한 접근 제어자
protected 같은 패키지 내부에 있는 클래스, 하위 클래스에서 접근이 가능한 접근 제어자
자기 자신과 상속받은 하위 클래스 둘 다 접근이 가능한 접근 제어자
default 접근 제어자를 명시하지 않은 경우로 같은 패키지 내부에 있는 클래스에서 접근이 가능한 접근 제어자
자바에만 접근하는 접근 제어자
private 같은 클래스 내에서만 접근이 가능한 접근 제어자

 

 

2. 클래스 사용

- 클래스는 변수와 메소드 형태로 구성되어 있다. 

- 클래스에서 변수는 변수 선언과 동일하고, 메소드는 메소드 사용자 정의함수와 문법이 동일하다.

- 파이썬은 별도로 변수 선언을 하지 않기 때문에 메소드 형태로 구성되어 있다. 

 

▼ 파이썬 클래스 정의

class 클래스명 : 

def 메소드명(self, 변수명, ...)

명령어

return 반환값

-> 파이썬에서는 함수명에 입력받을 값(매개변수) 앞에 self라는 키워드를 적어야 한다.

 

 

[1] :  자신 클래스 참조

① this 포인터

- this 포인터는 현재 객체를 가리키는 포인터이다.

- 자바에서 사용하는 것으로 클래스 내부의 변수와 함수를 가리킬 수 있다. 

 

ex)

this.변수;

this.함수(매개변수);

 

② self

- self는 현재 객체를 가리키는 포인터이다.

- 파이썬에서 사용하는 거승로 클래스 내부의 변수와 함수를 가리킬 수 있다.

 

ex)

self.변수명;

self.함수명(매개변수);

 

 

[2] : static 메소드

- 클래스가 메모리에 올라갈 때 자동적으로 생성되는 메소드이다.

- 인스턴스를 생성하지 않아도 호출이 가능하게 된다. 

 

 

[3] : 클래스 선언

- 클래스를 일반변수로 선언한 경우 선언함과 동시에 생성자가 호출되고, 일반변수로 선언한 곳에서 함수가 종료되면 소멸자가 호출된다.

 

▼ 자바 클래스 선언

클래스 클래스변수 = new 클래스(매개변수);

클래스변수.finalize(); -> 소멸시

 

▼파이썬 클래스 선언

클래스변수 = 클래스(매개변수)

del 클래스변수 -> 소멸시

 

 

(8) 생성자

- 생성자는 해당 클래스의 객체가 생성될 때 자동으로 호출되는 특수한 종류의 메소드이다.

- 생성자는 일반적으로 클래스의 멤버 변수를 초기화하거나 클래스를 사용하는 데 필요한 설정이 필요한 경우 사용한다.

- 자바에서는 클래스 명과 동일한 메소드명을 가지고, 반환 값이 없다.

- 파이썬에서는 __init__ 이라는 메소드명을 사용하고, 첫 번째 매개변수로  self를 적어주며, 반환 값이 없다.

 

▼ 자바에서 사용하는 생성자

public class 클래스명 {

public 클래스명(데이터_타입 변수명, ...) {

명령어;

}

}

 

▼파이썬에서 사용하는 생성자

class 클래스명 : 

def __init__(self, 변수명, ...);

명령어

 

 

(9) 소멸자

- 소멸자는 객체의 수명이 끝났을 때 객체를 제거하기 위한 목적으로 사용되는 메소드이다.

- 자바에서는 finalize라는 메소드를 사용하며, 반환 값이 없다.

- 파이썬에서는 __del__이라는 메소드명을 사용하고, 첫 번째 매개변수에 self를 적어주며, 반환 값이 없다.

 

▼ 자바에서 사용하는 소멸자

public class 클래스명 {

public void finalize(매개변수) {

명령어;

}

}

 

▼ 파이썬에서 사용하는 소멸자

class 클래스명 : 

def __del__(self) : 

명령어

 

 

 

(10) 상속

- 상속은 어떤 객체가 있을 때 그 객체의 변수와 메소드를 다른 객체가 물려받는 기능이다.

- 자식 클래스를 생성하면 무조건 부모 클래스의 생성자를 실행한 후에 자식 클래스의 생성자를 실행한다.

 

▼ 자바 상속

class 부모_클래스명 {

}

class 자식_클래스명 extends 부모_클래스명 {

}

 

▼ 파이썬 상속

class 부모_클래스명 : 

.......

class 자식_클래스명(부모_클래스명) : 

........

 

1. 오버로딩

- 오버로딩은 동일 이름의 메소드를 매개변수만 다르게 하여 여러 개 정의할 수 있는 기능이다. 

- 파이썬에서는 오버로딩 기능을 지원하지 않는다.

- 오버로딩 특징은 다음과 같다.

  • 메소드 이름이 같아야 한다.
  • 매개변수가 개수가 달라야 한다.
  • 매개변수 개수가 같을 경우 데이터 타입이 달라야 한다.
  • 반환형은 같거나 달라도 된다.

 

2. 오버라이딩

- 오버라이딩은 하위 클래스에서 상위 클래스 메소드를 재정의할 수 있는 기능이다.

- 오버라이딩 특징은 다음과 같다.

  • 오버라이드하고자 하는 메소드가 상위 클래스에 존재하여야 한다.
  • 메소드 이름은 같아야 한다.
  • 메소드 매개변수 개수, 데이터 타입이 같아야 한다.
  • 메소드 반환형이 같아야 한다.

 

▼ 자바 오버라이딩

class 부모_클래스명 {

public 반환_데이터_타입 메소드명(데이터_타입 변수명) {

.......

}

}

 

class 자식_클래스명 extends  부모_클래스명 {

public 반환_데이터_타입 메소드명(데이터_타입 변수명) {

//부모클래스의 메소드명, 매개변수가 동일해야 함

}

}

 

 

▼ 파이썬 오버라이딩

class 부모_클래스명

def 메소드명(self, 변수명)

 

class 자식_클래스명(부모_클래스명)

def 메소드명(self, 변수명)

#부모 클래스의 메소드명, 매개변수의 갯수가 동일해야 함 

 

 

(11) 추상 클래스

- 추상 클래스는 미구현 추상 메소드를 한 개 이상 가지며, 자식 클래스에서 해당 추상 메소드를 반드시 구현하도록 강제하는 기능이다. 

 

▼ 자바 추상 클래스

abstract class 클래스명 {

abstract 데이터_타입 메소드명( );

}

 

▼ 파이썬 추상 클래스

class 클래스명 : 

def 메소드명(self) : 

pass

 

 

 

(12) 인터페이스

- 인터페이스는 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위한 문법이다.

- 오직 추상 메소드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않는다.

- 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려져 있는 '기본 설계도'라고 할 수 있다.

 

▼자바 인터페이스

interface 클래스명 {

데이터_타입 메소드명( );

}