'클래스'에 해당되는 글 5건

  1. 2018.11.08 C# 기초다지기 - 클래스
  2. 2018.11.04 Object 클래스에 대해
  3. 2018.10.17 자바 상속
  4. 2018.10.09 C++ 클래스와 객체
  5. 2018.09.08 C++ 자바 상속 비교

C# 기초다지기 - 클래스




안녕하세요 열코입니다.

이번시간에는 C# 클래스에 대해 알아보겠습니다.

클래스는 구조체와 비슷한 사용자 정의 자료형이지만 메소드(함수)를 가질 수 있습니다.

객체(Object)는 클래스의 인스턴스입니다. 클래스를 구성하는 변수와 메소들르 클래스의 멤버라고 합니다.


클래스 정의하기

클래스 정의는 class 키워드와 클래스의 이름으로 시작합니다.

클래스의 몸체는 중괄호 { }로 둘러싸여있습니다.

다음 예제와 같이 자세히 설명하도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
 
namespace SquareApplication {
    class Square {
        private double length;
        public double GetLength() {
            return length;
        }
        public void SetLength(double length_) {
            length = length_;
        }
        public double GetArea() {
            return length * length;
        }
    }
    class mainfunction {
        static void Main(string[] args) {
            Square sq1 = new Square();
            Square sq2 = new Square();
 
            sq1.SetLength(2);
            sq2.SetLength(10);
 
            Console.WriteLine("SQUARE1 AREA : {0}", sq1.GetArea()); // 4 출력
            Console.WriteLine("SQUARE2 AREA : {0}", sq2.GetArea()); // 100 
        }
    }
}
cs


- 액세스 지정자는 멤버에 대한 접근 규칙을 지정합니다.

- public 지정자는 함수 외부에서 직접 접근이 가능합니다.

- private 지정자는 함수 내부에서만 직접 접근이 가능합니다.

- protected 지정자는 상속받은 클래스 내부에서만 직접 접근이 가능합니다.

- 클래스 멤버의 기본 액세스 지정자는 private 입니다.

- 클래스 맴버에 접근하기위해 점(.) 연산자를 사용합니다.


멤버함수 및 캡슐화

클래스의 멤버 함수는 다른 변수와 비슷한 클래스 정의내에 프로토타입을 갖는 함수입니다.

위의 예제에서 SetLength, GetLength, GetArea 함수가 멤버함수를 의미합니다.

C#에서 캡슐화는 액세스 지정자에 의해 결정됩니다.

-> C# 캡슐화 설명보러가기

위의 예제코드는 캡슐화를 구현하기 위해 멤버 변수 length를 private 멤버로 숨기고,

public 메소드를 통해 함수 외부에서 간접적으로 접근하도록 하였습니다.


C# 생성자

클래스의 생성자는 클래스의 새로운 인스턴스(객체)를 생성할때 실행되는 특별한 멤버함수입니다.

생성자를 만들기 위해서는 반환형이 없으며 함수이름이 클래스의 이름과 동일합니다.

다음 예제를 통해 생성자에 대한 개념을 설명하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
 
namespace SquareApplication {
    class Square {
        private double length;
        
        public Square() {
            Console.WriteLine("생성자가 호출되었습니다.");
        }        
 
        public double GetLength() {
            return length;
        }
        public void SetLength(double length_) {
            length = length_;
        }
        public double GetArea() {
            return length * length;
        }
    }
    class mainfunction {
        static void Main(string[] args) {
            Square sq1 = new Square(); // 생성자 호출
            Square sq2 = new Square(); // 생성자 호출
 
            sq1.SetLength(2);
            sq2.SetLength(10);
 
            Console.WriteLine("SQUARE1 AREA : {0}", sq1.GetArea()); // 4 출력
            Console.WriteLine("SQUARE2 AREA : {0}", sq2.GetArea()); // 100 출력
        }
    }
}
cs



위 코드에서 23, 24번줄에 Square 클래스의 객체를 생성할 때 정의된 생성자가 호출됩니다.

생성자를 따로 지정하지 않아도 기본(default) 생성자가 호출됩니다.

기본 생성자는 아무일도 하지않는 함수입니다.

생성자는 대게 멤버 변수 값을 초기화하는 용도로 사용됩니다.

또한 생성자에 매개변수를 추가하여 오버라이딩하여 사용할 수 있습니다.

다음 예제를 통해 확인하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
 
namespace SquareApplication {
    class Square {
        private double length;
        
        public Square(double length_) {
            length = length_;
            Console.WriteLine("생성자가 호출되었습니다.");
        }        
 
        public double GetArea() {
            return length * length;
        }
    }
    class mainfunction {
        static void Main(string[] args) {
            Square sq1 = new Square(4.0); // 생성자 호출
            Square sq2 = new Square(12); // 생성자 호출
 
            Console.WriteLine("SQUARE1 AREA : {0}", sq1.GetArea()); // 16 출력
            Console.WriteLine("SQUARE2 AREA : {0}", sq2.GetArea()); // 144 출력
        }
    }
}
cs

 

18, 19번줄의 객체를 생성하는 과정에서 매개변수 값을 넘겨주어 생성자에서 멤버 변수의 값을 초기화합니다.



C# 소멸자

소멸자는 클래스의 객체가 지정된 범위를 벗어나 할 일을 모두 끝냈을 때 호출되는 특정 멤버 함수입니다.

접두사 물결(~)이 붙어있으며 생성자와 같이 함수 이름은 클래스의 이름과 동일합니다.

사용자가 정의하지 않아도 기본(default) 소멸자가 제공되며, 대게 메모리를 해제하는데 사용됩니다.

다음 예제로 소멸자에 대해 살펴보도록하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
 
namespace SquareApplication {
    class Square {
        private double length;
        
        public Square(double length_) {
            length = length_;
            Console.WriteLine("생성자가 호출되었습니다.");
        }        
 
        ~Square() {
            Console.WriteLine("소멸자가 호출되었습니다.");
        }
 
        public double GetArea() {
            return length * length;
        }
    }
    class mainfunction {
        static void Main(string[] args) {
            Square sq1 = new Square(4.0); // 생성자 호출
            Square sq2 = new Square(12); // 생성자 호출
 
            Console.WriteLine("SQUARE1 AREA : {0}", sq1.GetArea()); // 16 출력
            Console.WriteLine("SQUARE2 AREA : {0}", sq2.GetArea()); // 144 출력
        } // 이 시점에서 소멸자가 생성자의 역순으로 출력됩니다.
    }
}
cs


메인함수내의 Square 클래스의 객체 sq1과 sq2가 차례로 생성되고

27번줄에서 Main함수가 끝남과 동시에 객체 sq1과 sq2가 메모리 해제되며 소멸자가 호출됩니다.

소멸자는 생성자의 역순으로 sq2, sq1 순으로 호출됩니다.



이상 'C# 클래스'에 대해 알아보았습니다.

질문 사항은 모두 커뮤니티에서 받습니다. -> 커뮤니티 바로가기

메인 페이지로 이동하시면 더 많은 자료를 볼 수 있습니다.


'C#' 카테고리의 다른 글

C# 기초다지기 - 상속  (0) 2018.11.09
C# 기초다지기 - 구조체  (0) 2018.11.08
C# 기초다지기 - 문자열  (2) 2018.11.07
C# 기초다지기 - 배열  (1) 2018.11.06
C# 기초다지기 - 상수  (0) 2018.11.06
C# 기초다지기 - 캡슐화  (0) 2018.11.05
C# 기초다지기 - 프로그램 구조  (0) 2018.11.05
C# 기초다지기 - 변수  (0) 2018.11.05

Object 클래스에 대해




안녕하세요 열코입니다.

이번시간에는 자바의 Object 클래스에 대해 알아보도록 하겠습니다.

일전에 Object 클래스에대해 언급했던적이 있는데, 자바의 모든 요소들은 클래스로 정의되어있으며,

직접 또는 간접적으로 Object 클래스에서 상속받은것이라고 언급한적이 있습니다.

자바의 모든 클래스의 부모 클래스인 Object 클래스에 대해 살펴보겠습니다.


Obejct 클래스는 java.lang 이라는 패키지(package) 내에 존재합니다.

또한 위에서 언급했듯이 모든 클래스의 부모 클래스이기 때문에 모든 클래스에서 Object 클래스의 메소드를 사용할 수 있습니다.

추가로 모든 메소드는 오버라이드(재정의) 하여 프로그램에서 적절히 사용가능합니다.

대표적인 Object 클래스의 메소드는 다음과 같습니다.


1. toString()

toString() 함수는 Object 클래스의 메소드로 객체를 String으로 변환하는데 사용됩니다.

다음과 같이 정의되어있습니다.


1
2
3
public String toString() {
    return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
cs


2. hashCode()

hashCode() 함수는 JVM으로 부터 모든 객체에 대해 고유번호(해시코드)를 생성, 반환합니다.

자바에서는 C/C++과 같이 객체의 주소값을 찾을 수 없기 때문에 이 해시코드를 사용합니다.

다음과 같이 사용할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class student
{
    static int addr = 100;
    int addr_num;
 
    student()
    {
        addr_num = addr;
        addr++;
    }
 
    public int hashCode() // 오버라이딩
    {
        return addr_num;
    }
    
    public static void main(String[] args)
    {
        student s = new student();
 
        System.out.println(s);
        System.out.println(s.toString);
    }
}
cs


3. equals()

eqauls() 함수는 매개변수로 주어진 객체를 this 객체와 비교합니다. (this 객체는 메소드를 호출한 객체를 의미합니다.)

보통 String 객체의 비교시 사용되며, 사용자 정의 클래스에서는 오버라이딩하여 사용하는것이 좋습니다.



4. getClass()

getClass() 함수는 this 객체의 실제 런타임 클래스를 가져옵니다.


1
2
3
4
5
6
7
8
9
public class semog
{
    public static void main(String[] args)
    {
        Object obj = new String("세모지");
        Class c = obj.getClass();
        System.out.println(c.getName()); // java.lang.String 
    }
}
cs


c 클래스의 getName()을 호출했는데 String 클래스가 반환되었습니다.

c 클래스는 obj객체의 클래스를 받아오며 obj 객체는 String 클래스 객체를 가지고 있습니다.

이에 대한 설명은 C/C++의 가상(virtual) 함수에 대한 내용을 확인하시면 됩니다.


5. finalize()

finalize() 함수는 객체가 가비지 컬렉터에 의해 수집되기 직전에 호출됩니다.

가비지 컬렉터 호출에 대해 대략 설명하면 객체에 대한 참조가 없다고 판단될 경우 JVM의 가비지 컬렉터가 호출됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class semog
{
    public static void main(String[] args)
    {
        semog s = new semog();
        s = null// 객체 참조가 없음
 
        System.gc(); // 가비지 컬렉터 호출
    }
    protected void finalize() // 오버라이딩
    {
        System.out.println("finalize 메소드 호출");
    }
}
cs


참고 : finalize() 함수는 해당 객체가 가비지 컬렉터를 여러번 수행했더라도 한번만 호출되게됩니다.

그외 메소드에 대해서는 자바 쓰레드 시간에 자세히 언급하도록 하겠습니다. :)



이상 '자바 object 클래스'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

메인 페이지로 이동하시면 더 많은 자료를 볼 수 있습니다.



자바 상속




안녕하세요 열코입니다.

상속은 객체지향 프로그래밍의 중요한 기능중 하나입니다.


주요 용어

- Super Class : 기능이 상속 된 클래스 (기본, 상위 클래스)


- Sub Class : 다른 클래스를 상속하는 클래스(파생, 하위 클래스)

서브 클래스는 수퍼 클래스 필드와 메소드 외에도 자체 필드와 메소드를 추가 할 수 있습니다.


- Reusability : 재사용성

새로운 클래스를 만들 때 상위 클래스에 이미 포함된 코드를 새 클래스에 파생시켜 재사용합니다.



상속을 사용하기 위해 extends 키워드를 사용합니다.

예)


1
2
3
class child extends parent {
    // methods and fields
}
cs


상속의 구체적인 설명을 위해 예제 코드를 통해 알아보도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Main {
    public static void main(String[] args) 
    {
        Child c = new Child(5);
        c.up();
        c.up();
        c.print();
    }
}
class Parent {
    protected static int a;
    
    public Parent(int get) {
        a = get;
    }
    
    public void up() {
        a++;
    }
    public void down() {
        a--;
    }
    
    public void print() {
        System.out.println(a);
    }
}
 
class Child extends Parent {
    private int b;
    
    public Child(int get) {
        super(a);
        a = get;
        b = get + 5;
    }
    
    public void print() {
        System.out.println(a + ", " + b);
    }
}
cs


위 프로그램에서 상속하는 동안 수퍼클래스가 아닌 하위클래스 객체만 생성됩니다.

Child 클래스의 객체가 만들어지면 수퍼클래스의 모든 메소드와 필드의 복사본을 Child 객체의 메모리로 가져옵니다.

그래서 하위 클래스의 객체에서 수퍼클래스의 멤버에 접근할 수 있습니다.



자바에서는 여러가지 상속 유형을 지원합니다.

1. 단일 상속(Single Inheritance)

단일 상속에서 하위 클래스는 수퍼 클래스의 기능을 상속받습니다.

위 그림에서 부모클래스는 자식클래스의 기본 클래스로 사용됩니다.


2. 다중 레벨 상속(Multilevel Inheritance)

다중 레벨 상속에서 파생클래스는 기본 클래스를 상속하며 파생 클래스도 다른 클래스의 기본 클래스로 작동합니다.

자바에서 자식클래스가 조부모 클래스의 멤버에 직접 접근할 수 없습니다.(해당 참고자료)


3. 계층적 상속(Hierarchical Inhreitance)

계층적 상속은 하나의 클래스에서 둘 이상의 하위 클래스를 상속하는것을 말합니다.


4. 다중 상속(Multiple Inheritance)

하나이상의 수퍼클래스를 가지는것을 다중상속이라고합니다.

원래 자바에서는 다중상속을 지원하지는 않지만 인터페이스를 통해 구현이 가능합니다.


5. 하이브리드 상속(Hybrid Inheritance)

하이브리드 상속 역시 다중상속에 포함되기 때문에 자바에서 지원하지 않지만

인터페이스를 통해 구현 가능합니다.


자바 상속 관련

- 수퍼 클래스 : 수퍼 클래스가 없는 Object 클래스를 제외한 모든 클래스에는 하나의 수퍼클래스가 존재합니다.

다른 명시적 수퍼클래스가 없으면 암시적으로 Object 클래스의 서브 클래스입니다.

- 수퍼클래스는 하나만 존재 : 수퍼클래스는 여러개의 하위 클래스를 가질 수 있지만

하위 클래스는 하나의 수퍼클래스만 가질 수 있습니다. 이는 자바가 클래스와 함께 다중상속을 지원하지 않기 때문입니다.

위에서 설명했듯이 인터페이스를 통해 다중상속을 구현할 수 있습니다.

- 생성자 : 하위 클래스는 수퍼클래스의 모든 멤버를 상속합니다.

생성자는 멤버가 아니기 때문에 상속되지 않지만 super() 키워드를 통해 하위 클래스에서 호출 가능합니다.


하위 클래스 관련

- 상속된 필드는 다른 필드와 마찬가지로 직접 사용될 수 있습니다.

- 수퍼클래스에 없는 새 클래스를 서브클래스에 선언할 수 있습니다.

- 수퍼클래스에 없는 새 메소드를 서브클래스에 선언할 수 있습니다.

- 수퍼클래스에 있는 동일한 이름을 가진 메소드를 작성하여 오버라이드할 수 있습니다.

- 수퍼클래스에 있는 이름과 같은 새로운 static 메소드를 만들어 숨길 수 있습니다.



이상 '자바 상속'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.





C++ 클래스와 객체




안녕하세요 열코입니다.

저번 시간에 C/C++ 구조체에 대해 알아보았습니다. (구조체 공부하러가기)

이번시간에는 구조체와 비슷한 형태의 구조를 가진 클래스에 대해 알아보겠습니다.

(여담으로 C++이 세상에 나오기 전 C의 구조체를 모티브로 만든것이 C++의 클래스라고합니다.)


C++은 객체지향 프로그래밍의 대표적인 언어로써 객체지향 프로그래밍 언어의 구성요소인 클래스를 사용할 수 있습니다.


☞ 클래스(class)란?

사용자 정의 데이터 유형으로 데이터 멤버 및 멤버 함수가 포함되어 있으며, 

해당 클래스의 객체(Object 또는 Instance)를 생성하여 접근(Access)하고, 사용할 수 있습니다.


예를들어, 자동차라는 데이터 타입(변수)를 만들고자 할 때, 우리는 여러가지 변수와 함수 중 

바퀴의 수, 속도 제한, 주행 거리 등의 공통 속성을 찾아 만들어야 합니다.


또한 클래스가 정의 될 때 메모리에 할당되지 않으며 객체가 생성될 때 메모리가 할당됩니다.



 클래스 정의 및 객체 선언 방법?

클래스의 정의 방법은 구조체의 정의 방법과 유사합니다.

아래의 예제를 확인하세요.


1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
 
// 클래스 정의
class member {
 
};
 
int main(void) {
    member m1; // 객체 생성
    
    return 0;
}
cs


class라는 키워드를 사용하여 클래스를 정의하고, 일반 변수 선언하듯이 (int a;) 객체를 생성해서 사용할 수 있습니다.

하지만 구조체와 다른 점으로는 데이터 멤버에 접근 지정자를 지정해 줄 수 있습니다.

접근 지정자는 3가지로 나뉘는데


public, private, protected 이렇게 3가지로 나뉩니다.


public 멤버는 공개 데이터 맴버로 클래스 내부 및 외부에서도 객체를 통해 접근이 가능합니다.

private 멤버는 비공개 데이터 멤버로 클래스 내부에서만 접근이 가능합니다.

protected 멤버는 보호된 데이터 멤버로 상속된 클래스 한정 접근 가능합니다.

(protected에 대해서는 상속 시간에 더 자세히 알아보겠습니다. ^^)



public 및 private 접근 지정자는 아래와 같이 지정해 줄 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
using namespace std;
 
class member {
private :
    int id;
    string name;
    
public :
    void print_name() {
        cout << name;
    }
 
};
 
int main(void) {
    member m1;
    
    return 0;
}
cs


☞ 클래스의 멤버 함수 정의 방법?

멤버 함수를 정의하는 방법은 두 가지가 있습니다.

첫번째는 내부 클래스 정의이며, 두번째는 외부 클래스 정의입니다.

내부 클래스 정의는 말 그대로 클래스 내부에 멤버 함수를 정의하는 것이고,

외부 클래스 정의는 :: 연산자(scope resolution)를 사용해야 합니다.

아래는 외부 클래스 정의의 예제 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>
using namespace std;
 
class member {
private :
    int id;
    string name;
    
public :
    // 내부 클래스 정의
    void print_name() {
        cout << name;
    }
 
    // 외부 클래스 정의
    void print_id();
};
 
// 외부 클래스 정의
void member :: print_id() {
    cout << id;
}
 
int main(void) {
    member m1;
    
    return 0;
}
cs


☞ 생성자, 소멸자?

클래스는 객체가 인스턴스화(객체 생성) 될 때마다 컴파일러에 의해 호출되는 특수 메소드가 있는데,

바로 생성자 라는 함수입니다.

생성자, 소멸자에는 다음과 같은 유형이 있습니다.


1. 디폴트 생성자

2. 매개변수 생성자

3. 복사 생성자

4. 소멸자


처음 들으신 분들은 많이 생소하실수도 있지만 하나씩 설명해 나가겠습니다.



1. 디폴트 생성자

첫번째 디폴트 생성자는 사용자가 직접 생성자를 정의해 주지 않아도 알아서 만들어지는 생성자입니다.(눈에 보이진 않습니다.)

내부적으로 알아서 처리되는 녀석인데

이를 사용자가 직접 정의해 줄 수 있습니다.

아래 예제 코드는 디폴드 생성자 예제입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
class Point {
private :
    int x;
    int y;
    
public :
    // 디폴트 생성자
    Point() {
        x = 10;
        y = 15;
    }
    void print() {
        cout << "X : " << x << ", Y : " << y << "\n";
    }
};
 
int main(void) {
    Point p;
    p.print();    
}
cs


디폴트 생성자는 위와 같이 사용자가 직접 정의해 줄 수 있습니다.

함수 반환형은 없으며, 함수 이름은 클래스의 이름과 동일합니다.


2. 매개변수 생성자

두번째로 매개변수 생성자입니다.

매개변수 생성자를 통해 객체 생성 시 클래스 멤버 변수의 값을 초기화 할 수 있습니다.

아래 예제 코드는 매개변수 생성자 예제입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
 
class Point {
private :
    int x;
    int y;
    
public :
    // 디폴트 생성자
    Point() {
        x = 10;
        y = 15;
    }
    // 매개변수 생성자
    Point(int x, int y) {
        this->= x;
        this->= y;
    }
    void print() {
        cout << "X : " << x << ", Y : " << y << "\n";
    }
};
 
int main(void) {
    Point p;
    p.print();    
 
    Point p2 = { 34 };
    p2.print();
}
cs


매개변수 생성자는 생성자 함수 매개변수로 값을 넘겨받아 클래스 멤버 변수를 초기화 할 때 사용합니다.

매개변수 생성자 안의 this 키워드는 클래스 자신의 객체를 가리키는 특수 키워드로써 자기자신을 의미한다고 생각하시면 됩니다.



3. 복사 생성자

복사 생성자는 기존의 객체를 복사하여 새로운 객체를 생성합니다. 컴파일러는 모든 클래스의 기본 복사 생성자를 제공합니다.


1
2
3
4
5
6
7
int main(void) {
    Point p;
    p.print();    
 
    Point p2 = p;
    p2.print();
}
cs


Point p2 = p; 에서처럼 컴파일러에서 제공하는 디폴트 복사 생성자를 호출하는 모습입니다.

나중에 시간이 되면 이 복사 생성자에 대해서도 자세히 알아보도록 하겠습니다!


4. 소멸자

소멸자는 객체의 사용이 모두 끝날 때 컴파일러에서 호출하는 특수 멤버 함수입니다.

생성자와 같이 디폴트 소멸자가 기본적으로 생성됩니다.

보통 클래스 내에서 동적 할당한 메모리를 해제할 때 유용하게 사용됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;
 
class Point {
private :
    int x;
    int y;
    
public :
    // 디폴트 생성자
    Point() {
        x = 10;
        y = 15;
    }
    // 매개변수 생성자
    Point(int x, int y) {
        this->= x;
        this->= y;
    }
 
    // 디폴트 소멸자
    ~Point() {
        cout << "소멸자 호출\n";
    }
    void print() {
        cout << "X : " << x << ", Y : " << y << "\n";
    }
};
 
int main(void) {
    Point p;
    p.print();    
 
    Point p2 = p;
    p2.print();
}
cs



이상 '클래스와 객체'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.



'C, C++' 카테고리의 다른 글

C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10
C++ 클래스 접근제한자  (0) 2018.10.10
C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02
C++ 벡터 사용법  (2) 2018.09.26

C++ 자바 상속 비교



상속의 목적은 C++과 자바 모두 동일합니다.

우리가 상속을 받는 목적은 코드를 재사용하거나 is-a 관계를 생성하기 위함입니다.

그렇다면 이 두 객체지향언어(Object-Oriented Laguage)의 상속의 차이점에 대해 비교해보겠습니다.


◎ 자바에서 모든 클래스(Class)는 직접 또는 간접적으로 Object Class에서 상속받습니다. 자바에서 상속받지 않는 클래스를 작성하면 기본적으로 Object 클래스에서 자동으로 상속됩니다. 


◎ 자바에서는 부모의 부모(조부모; GrandParent) 클래스에 직접 접근할 수 없습니다.(not directly accessible, c++에서는 :: 연산자를 사용하여 접근 가능합니다.) 부모의 부모 클래스에 접근하기 위해서는 부모 클래스를 통해 접근할 수 있습니다. 


예)

class GrandParent {

public void Print() {

System.out.println("GrandParent");

}

}


class Parent extends GrandParent {

public void Print() {

System.out.println("Parent");

}

}


class Child extends Parent {

super.super.Print(); // 에러 발생!!

public void Print() {

System.out.println("parent");    

}

}


class Main {

public static void main(String args[]) {

Child c = new Chid();

c.Print();

}

}


위 코드는 super.super.Print() 줄에서 오류가 발생합니다. 아래 코드처럼 수정할 수 있습니다.


class GrandParent {

public void Print() {

System.out.println("GrandParent");

}

}


class Parent extends GrandParent {

super.Print();

public void Print() {

System.out.println("Parent");

}

}


class Child extends Parent {

super.Print(); // 부모 클래스를 통해 접근 가능!

public void Print() {

System.out.println("parent");

}

}


class Main {

public static void main(String[] args) {

Child c = new Chid();

c.Print();

}

}


◎ 상속받지 않은 다른 클래스에서 protected 멤버에 접근할 수 있습니다.(클래스가 같은 패키지에 존재 해야합니다.)


예)

class A {

protected int x = 10;

}

class B {

public static void main(String[] args) {

A a = new A();

System.out.println(a.x); // 접근 가능!!

}

}


◎ 자바에서 상속은 extends 키워드를 사용합니다. C++과 달리 public, protected, private과 같은 지정자를 제공하지 않습니다. 


◎ 자바에서 메소드는 기본적으로 가상(Virtual) 메소드입니다. C++에서는 virtual 키워드를 명시적으로 사용해야 합니다.


예)

class A {

public void Print() {

System.out.println("A");

}

}


class B extends A {

public void Print() {

System.out.println("B");

}

}


class Main {

public static void main(String[] args) {

A a = new B();

b.show(); // B가 출력!!

}

}


◎ 자바는 추상클래스(abstract)와 인터페이스(interface)를 구분된 키워드로 사용합니다.


◎ 자바는 다중 상속(둘 이상의 클래스에서 상속)을 지원하지 않습니다. C++은 지원합니다.




코드는 직접 작성했기 때문에 오타 때문에 정상적으로 작동하지 않을 수 있습니다.

해당 게시글에 대한 궁금한점 있으시면 댓글로 달아주시면 답변 해 드리겠습니다.

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.

'C, C++' 카테고리의 다른 글

C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02
C++ 벡터 사용법  (2) 2018.09.26
C언어 포인터  (8) 2018.09.25
C 랜덤 - 난수 생성하기  (7) 2018.09.06
C++ String 문자열 사용법 정리  (0) 2018.08.20
[C++] C# 연동하기 / C# dll 파일 만들기  (1) 2018.08.18

to Top