: 사용자가 직접 새로운 함수를 정의하여 사용
#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')
}
def fn(num):
if num%2 == 0 :
return 'Y'
else :
return 'N'
a = fn(5)
print(a)
: 함수 자신이 자신을 부르는 함수
#include <iostream>
int fn(int n) {
if(n <= 1)
return 1;
else
return n*fn(n-1);
}
void main(){
std::cout << fn(3); // 출력 6
}
: 권한 설정
public : 외부 모든 클래스에서 접근 가능
protected : 같은 패키지 내부에 있는 클래스, 하위 클래스에서 접근 가능
default : 같은 패키지 내부에 있는 클래스에서 접근 가능 (java에만)
private : 같은 클래스 내에서만 접근 가능
C++
class 클래스명 {
private:
변수_타입 변수명;
public:
반환_데이터_타입 메서드명(데이터_타입 변수명 ...) {
명령어
return 반환값;
}
}
public class 클래스명 {
private 변수_타입 변수명;
public 반환_데이터_타입_ 메서드명(데이터_타입 변수명, ...){
명령어
return 반환값;
}
}
class 클래스명:
def 메서드명(self, 변수명, ...):
명령어;
return 반환값;
// 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
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.함수명(매개변수)`
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;
}
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));
}
class A:
def add(self, a, b):
sum = a + b
return sum
a = A()
print(a.add(5, 7))
__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; // 클래스가 소멸되면서 소멸자 호출
}
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();
}
}
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
일반함수
소멸자
: 어떤 객체가 있을 떄 그 객체의 변수와 메서드를 다른 객체가 물려받는 기능
#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;
}
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();
}
}
class A:
def fnA(self):
print('A')
class B(A):
def fnB(self):
print('B')
b = B()
b.fnA()
b.fnB()
#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;
}
#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;
}
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();
}
}
class A:
def fn(self):
print("A")
class B(A):
def fn(self):
print("B")
a = B()
a.fn()
::
super
super
: 미구현 추상 메서드를 한개 이상 가지며 자식 클래스에서 해당 추상 메서드를 반드시 구현하도록 강제
#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;
}
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();
}
}
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()
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();
}
}