[정보처리기사 실기] 6. 프로그래밍 언어 활용 (1)-2

Sua An·2021년 10월 7일
0
post-thumbnail

📌 사용자 정의함수

: 사용자가 직접 새로운 함수를 정의하여 사용

  • C
#include <stdio.h>

char fn(int num) {		// 함수명은 fn이고, 입력값은 num
	if(num % 2 == 0)
    	return 'Y'		// 반환값은 char
    else
    	return 'N'
}
void main() {
	char a = fn(5);		// a라는 변수에 반환값 저장
    printf("%c\n", a);		// a 출력 ('N')
}
  • Python
def fn(num):
	if num%2 == 0 :
    	return 'Y'
    else :
    	return 'N'

a = fn(5)
print(a)

📌 재귀함수

: 함수 자신이 자신을 부르는 함수

  • C
#include <iostream>

int fn(int n) {
	if(n <= 1)
    	return 1;
    else
    	return n*fn(n-1);
}

void main(){
	std::cout << fn(3);	// 출력 6
}

📌 클래스

  • 객체지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 틀 (C언어는 지원X)
  • 변수와 메서드 형태로 구성
  • 변수는 변수 선언과 동일, 메서드는 사용자 정의함수와 동일 문법
  • 파이썬은 별도로 변수 선언 하지 않기 때문에 메서드 형태로 구성

✅ 접근 제어자

: 권한 설정

  • public : 외부 모든 클래스에서 접근 가능

  • protected : 같은 패키지 내부에 있는 클래스, 하위 클래스에서 접근 가능

  • default : 같은 패키지 내부에 있는 클래스에서 접근 가능 (java에만)

  • private : 같은 클래스 내에서만 접근 가능

  • C++

class 클래스명 {
private:
	변수_타입 변수명;
public:
	반환_데이터_타입 메서드명(데이터_타입 변수명 ...) {
    	명령어
        return 반환값;
    }
}
  • Java
public class 클래스명 {
	private 변수_타입 변수명;
    public 반환_데이터_타입_ 메서드명(데이터_타입 변수명, ...){
    	 명령어
         return 반환값;
    }
}
  • Python
  • 입력받을 값(매개변수) 앞에 self라는 키워드를 적어야 한다
class 클래스명:
	def 메서드명(self, 변수명, ...):
    	명령어;
        return 반환값;

📌 자신 클래스 참조

✅ this 포인터

  • 현재 객체를 가리키는 포인터
  • C++(->), Java(.)에서 사용하는 것으로 클래스 내부의 변수와 함수를 가리킬 수 있음
  • C++
// C++
#include <iostream>
class A{
private:
	int a;
public:
	void setA(int a){	//setA 함수에서 매개변수 a받음
    
    this->a = a;		//this->a는 클래스 내의 변수, a는 매개변수
    }
    int getA(){			// 클래스 내의 변수에 저장된 a 반환
		return a;
	}
};
void main() {
	A* a = new A();		// a라는 변수에 A클래스 생성
    a -> setA(5);		// 5를 저장
    std::cout << a->getA();	// 저장된 값 출력
    delete a;			// 변수 메모리 해제
}
  • Java
//Java
public class A{
	private int a;
    public void setA(int a){	// a라는 매개변수 받는 함수
    	
        this.a = a;		// this.a는 클래스 내의 변수, a는 매개변수
    }
    public int getA() {		// 클래스 내의 a 반환
    	return a;
    }
    public static void main(String[] args){
    	A a = new A();		// a라는 변수에 A클래스 생성
        a.setA(5);		// setA 함수를 통해 5 저장
        System.out.print(a.get(A));	// 저장된 값을 getA를 통해 출력
    }
}

✅ self

- 현재 객체를 가리키는 포인터
- 파이썬에서 사용, 클래스 내부의 변수와 함수 가리킴

- `self.변수명`
- `self.함수명(매개변수)`
class A:
	def setA(self, a):	# a라는 매개변수 받음
    	self.a = a		# self.a는 클래스 내의 변수, a는 매개변수
    
    def getA(self):		# 클래스 내의 변수에 저장된 a 반환
    	return self.a
        
a = A()				# a라는 변수에 A클래스 생성
a.setA(5)			# 5 저장
print(a.getA())			# 저장된 값 출력

📌 클래스 선언

  • 일반 변수로 선언한 경우, 생성자 호출, 함수 종료되면 소멸자 호출

  • 포인터 변수로 선언한 경우 new 키워드를 이용해 선언함과 동시에 생성자 호출, delete 키워드를 이용해 해당 변수 저장 공간 삭제하면 소멸자가 호출

  • C++

#include <iostream>
using namespace std;
class A {
private :
	int sum;
public :
	int add(int a, int b) {
    sum = a + b;
    return sum;
  }
};
void main() {
	A* a = new A();
    cout << a->add(5,7) << endl;
    
    delete a;
}
  • Java
public class A{
	private int sum;
    public int add(int a, int b){
    	sum = a + b;
        return sum;
}

public static void main(String[] args) {
	A a = new A();
    System.out.println(a.add(5, 7));
}
  • Python
class A:
	def add(self, a, b):
    	sum = a + b
        return sum
a = A()
print(a.add(5, 7))

📌 생성자와 소멸자

✅ 생성자

  • 해당 클래스의 객체가 생성될 때 자동으로 호출되는 메서드
  • 클래스의 멤버 변수를 초기화하거나 클래스를 사용하는 데 설정이 필요한 경우 사용
  • C++, Java : 클래스명과 동일한 메서드명을 가지고 반환값 X
  • Python : __init__이라는 메서드명 사용, 첫번째 매개변수는 self, 반환값 X

✅ 소멸자

  • 객체의 수명이 끝났을 때 객체를 제거하기 위한 목적으로 사용되는 메서드

  • C++ : 클래스명과 동일한 메서드명, '~' 사용, 입력값과 반환값 X

  • Java : finalize라는 메서드 사용, 반환값 X

  • Python : __del__이라는 메서드명 사용, 첫번째 매개변수 self, 반환값 X

  • C++

#include <iostream>
using namespace std;
class A {
public:
	A(){
    cout << "생성자1" << endl;	// 매개변수 없는 생성자
  };
  	A(int a){
    cout << "생성자2" << endl;	// int형 매개변수 받는 생성자
  };
    ~A(){
    cout << "소멸자1" << endl;	// 소멸자 생성
  };
  	void fn() {
    cout << "일반함수" << endl;	// 일반 메서드
  }
};

void main(){
	A* a = new A(5);	// 클래스가 생성될 때 매개변수 5 넣었으므로
    				// int형 매개변수가 있는 생성자 호출
    a->fn();			// fn 메서드 호출
    delete a;			// 클래스가 소멸되면서 소멸자 호출
}
    
  • Java
public class A{
	public A(){
    System.out.println("생성자1");
  }
	public A(int a){
    System.out.println("생성자2");
  }
	public void finalize(){
    System.out.println("소멸자");
  }
	public void fn(){
    System.out.println("일반함수");
  }  
  
  public static void main(String[] args){
  A a = new A(5);
  
  a.fn(5);
  a.finalize();
  }
}
  • Python
class A :
	def __init__(self):
    	print("생성자1")
	def __init__(self, int):
    	print("생성자2")        
	def __init__(self):
    	print("소멸자")
	def __init__(self):
    	print("일반함수") 

a = A(5)
a.fn()
del a
  • 출력 결과
생성자2
일반함수
소멸자

📌 상속

: 어떤 객체가 있을 떄 그 객체의 변수와 메서드를 다른 객체가 물려받는 기능

  • C++
#include <iostream>
using namespace std;

class A{
public:
	void fnA(){
    cout << "A" << endl;
  }
};  
class B : public A{		// 클래스 B는 A를 상속받음
public:
	void fnB(){
    cout << "B" << endl;
  }
}; 

void main(){
	B* b = new B();
    
    b->fnA();
    b->fnB();
    
    delete b;
}
  • Java
public class A{
	public void fnA(){
  		System.out.println("A");
  }
}
public class B extends A{
	public void fnB(){
  		System.out.println("B");
  }
}

public class MainTest {
	public static void main(String[] args){
  		B b = new B();
        
        b.fnA();
        b.fnB();
  }
}
  • Python
class A:
	def fnA(self):
    	print('A')
class B(A):
	def fnB(self):
    	print('B')  
b = B()

b.fnA()
b.fnB()

✅ 오버로딩

  • 동일 이름의 메서드를 매개변수만 다르게 하여 여러개 정의할 수 있는 기능
  • 파이썬은 지원X
  • 특징
    • 메서드 이름이 같아야 함
    • 매개변수 개수가 달라야 함
    • 매개변수 개수가 같을 경우 데이터 타입 달라야 함
    • 반환형은 같거나 달라도 된다
  • C++
#include <iostream>
using namespace std;
class A{
public:
	void fn(){		// 매개변수 없는 fn
    count << "없음" <<endl;
  }
	void fn(int i){		// 매개변수 int형 하나
    count << i <<endl;
  }
	void fn(double d){	// 매개변수 double형 하나
    count << d <<endl;
  }
	int fn(int a, int b){	// 매개변수 int형 둘
    	return a+b;
  }  
};

void main(){
A* a = new A();
a -> fn();
a -> fn(7);
a -> fn(10.0);
cout << fn(2, 3) << endl;
}

✅ 오버라이딩

  • 하위 클래스에서 상위 클래스 메서드를 재정의할 수 있는 기능
  • C++에서는 virtual 키워드가 있어야 오버라이딩이 가능
  • 특징
    • 오버라이드하고자 하는 메서드가 상위 클래스에 존재해야 함
    • 메서드 이름 같아야 함
    • 메서드 매개변수 개수, 데이터타입 같아야 함
    • 메서드 반환형이 같아야 함
  • C++
#include <iostream>
using namespace std;
class A{
public:
	virtual void fn(){		// 오버라이드를 위해 virual 키워드
  		cout << "A" << endl;
  }    	
};
class B : public A{			// B는 A 상속받음
public:
	virtual void fn(){		// 오버라이드
  		cout << "B" << endl;
  }
};

void main(){
	A* a = new B();			// 부모 클래스 변수 타입으로 선언하고
    					// 자식 클래스로 생성
    	a -> fn();			// a는 B클래스로 생성되어 B의 fn 실행
   	 delete a;
}
  • Java
public class A{
	public void fn(){
  		System.out.println("A");
  }
}
public class B extends A{
	public void fn(){
  		System.out.println("B");
  }
}

public class MainTest{
	public staticvoid main(String[] args){
		A a = new B();
	    a.fn();
	}
}    
  • Python
class A:
	def fn(self):
  		print("A")  
 
class B(A):
	def fn(self):
  		print("B")  
a = B()
a.fn()

✅ 상위 클래스 접근

  • C++ ::
    : 부모_클래스::메서드명()
  • 자바 super
    : super.메서드명()
  • 파이썬 super
    : super().메서드명()

📌 추상 클래스

: 미구현 추상 메서드를 한개 이상 가지며 자식 클래스에서 해당 추상 메서드를 반드시 구현하도록 강제

  • C++
#include <iostream>
using namespace std;
class A{			// 추상 클래스 선언
public :
	virtual void fn()=0;	// 추상 메서드 fn 정의
};
class B : public A{		// 추상 클래스 A를 상속받은 클래스 B 선언
public :
	virtual void fn(){	// fn 상속받아 구현
    cout << "B" << endl;
  }
};
class C : public A{		// 추상 클래스 A를 상속받은 클래스 C 선언
public :
	virtual void fn(){	// fn 상속받아 구현
    cout << "C" << endl;
  }
};

main void() {
	A* b = new B();		// A 객체 변수에 B 객체 생성
    A* c = new C();		// A 객체 변수에 C 객체 생성
    b -> fn();
    c -> fn();
    delete b;
    delete c;
}
  • Java
abstract class A{			// 추상 클래스 A 선언
	abstract void fn();		// 추상 메서드 fn 정의(내부X) 
}
class B extends A{
	void fn(){
  		System.out.println("B");
  }
}
class C extends A{
	void fn(){
  		System.out.println("C");
  }
}
class MainTest{
	public void main(String[] args){
  		A b = new B();
        A c = new C();
        b.fn();
        c.fn();
  }
}
  • Python
class A:
	def fn(self):
    	pass
class B:
	def fn(self):
    	print("B")
class C:
	def fn(self):
    	print("C")
        
b = B()
c = C()
b.fn()
c.fn()

📌 인터페이스

  • 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프록램 유지보수성을 높이기 위한 문법 (일종의 추상클래스)
  • 오직 추상 메서드와 상수만을 멤버로 가질 수 있음
  • 구현된 것 없고 밑그림만 그려져 있는 '기본 설계도'
  • Java
interface A{
	void fn();
}

class B implements A{
	public void fn(){
  		System.out.println("B");
  }
class C implements A{
	public void fn(){
  		System.out.println("C");
  }  
class MainTest{
	public static void main(String[] args){
  		A b = new B();
        A c = new C();
        b.fn();
        c.fn();
  }
}

0개의 댓글