Presentation is loading. Please wait.

Presentation is loading. Please wait.

5 장 객체 지향 프로그래밍 5.1 객체 지향 프로그래밍의 개념 5.2 객체 지향 프로그래밍 2018-12-09.

Similar presentations


Presentation on theme: "5 장 객체 지향 프로그래밍 5.1 객체 지향 프로그래밍의 개념 5.2 객체 지향 프로그래밍 2018-12-09."— Presentation transcript:

1 5 장 객체 지향 프로그래밍 5.1 객체 지향 프로그래밍의 개념 5.2 객체 지향 프로그래밍

2 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 (7) 상속(Inheritance) 1) 상속이란 ?
Visual Basic.Net에서는 단일 상속만 지원한다. 만약 다중 상속이 필요한 경우에는 인터페이스(Interface)를 구현하는 방식을 사용한다. 자식 클래스 정의 자식 클래스인 TheDrivedClass에 새로운 멤버인 속성과 메소드를 추가함으로써 부모 클래스인 TheBaseClass의 기능을 확장할 수 있다. Public Class  TheDrivedClass     Inherits TheBaseClass      '속성과 메소드 등을 추가한다. End Class

3 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 ① NotInheritable 키워드 사용
상속을 위해 부모 클래스를 사용할 수 없도록 클래스를 정의하는데 사 용한다. NotInheritable 키워드를 사용한 부모 클래스 정의 만약 다른 클래스가 TheBaseClass 클래스로부터 상속을 시도하면 컴파일러 에러가 발생한다. Public NotInheritable Class  TheBaseClass      ... End Class Public Class  TheDrivedClass      Inherits TheBaseClass   '컴파일러 에러 발생    

4 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 ② MustInherit 키워드 사용
클래스의 인스턴스를 생성할 수 없도록 클래스를 정의하는데 사용한다. MustInherit 키워드를 포함하는 클래스는 다른 클래스의 부모 클래스로는 사용될 수 있지만 클래스의 객체를 생성할 수 없고, 부모 클래스 형태로만 사용된다. MustInherit 키워드를 사용하여 부모 클래스 정의 만약 다른 클래스가 TheBaseClass 클래스로 부터 새로운 클래스인 자식 클래스 생성을 시도하면 컴파일 에러가 발생한다. Public MustInherit Class  TheBaseClass ... End Class ‘자식 클래스 Dim NCar As New TheBaseClass()   '컴파일러 에러 발생

5 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 ③ Protected 키워드 사용
정의된 클래스와 그 클래스에서 상속된 자식 클래스에서 포로퍼티, 메소드, 데이터 멤버, 이벤트, 이벤트 핸들러를 한정하는데 사용된다. Protected 키워드를 사용하여 부모 클래스에 있는 멤버들을 정의 이 클래스에서 Protected로 선언된 멤버 필드는 이 클래스와 자식 클래스에서만 접근 가능하다. 만약 이 클래스로부터 상속되지 않은 다른 클래스가 Protected로 선언된 멤버 필드를 사용하면 에러가 발생한다. Public Class  TheBaseClass      '어디에서든지 접근할 수 있다.(모두 사용 가능)             public NoDoor As Integer        '이 클래스와 파생된 클래스에서만 접근(사용)가능하다.      protected color As String     End Class

6 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 ④ 상속 구현 Car 클래스의 속성과 메소드를 상속하여 Bus 클래스를 구현
자식 클래스인 Bus는 부모 클래스인 Car의 모든 속성과 메소드를 상속받아 그대로 사용할 수 있다. 또한, Bus 클래스에 Weight 속성과 BusAccelerate 메소드를 추가하여 사용할 수 있다. Bus는 Car로부터 상속받음

7 예제 프로그램 : 상속 예제 프로그램(Bus)
객체 지향 프로그래밍 예제 프로그램 : 상속 예제 프로그램(Bus) Car 클래스의 속성과 메소드를 상속하여 Bus 클래스를 구현한다. Weight 필드 : 버스의 무게를 나타내는 속성 BusAccelerate 메소드 : 무게당 마력(HorsePower)을 계산 1. Microsoft Visual Studio의 메뉴에서 [파일(F)]→[새 프로젝트(P)]를 선택하여 Visual Studio 안에 있는 “새 프로젝트” 화면을 연다. ‘새 프로젝트’ 화면에서 화면 좌측에 있는 ‘설치된 템플릿’의 항목에서 ‘Visual Basic’을 선택하고, 중간의 ‘템플릿’ 항목에서는 [Windows Forms 응용 프로그램]을 선택하여 [확인] 버튼을 클릭한다. 2. 새로운 프로젝트가 생성되었으면 새로운 클래스의 생성이 필요하다. 메뉴 에서 [프로젝트(P)] -> [클래스 추가(C)]를 선택한다. 3. 나타난 ‘새 항목 추가‘ 대화상자에서 템플릿은 클래스로 선택하고, 클래스 의 이름 항목에는 ‘Car.vb’를 입력하고, [추가] 버튼을 클릭한다.

8 객체 지향 프로그래밍 4. ‘Car.vb’ 파일을 클릭하여 연다. 그리고 다음의 코드를 Car 클래스 안에 작성한다.
Public Class Car '자동차 속도 필드 멤버 Public speed As Integer '자동차 기어단계 필드 멤버 Public GearLevel As Integer '자동차 마력 필드 멤버 Public HorsePower As Integer '읽기전용 speed 속성 설정 : speed값을 반환 ReadOnly Property SpeedPro() As Integer Get Return speed End Get End Property '읽기전용 기어단계 속성 설정 : GearLevel값을 반환 ReadOnly Property GearLevelPro() As Integer Return GearLevel

9 객체 지향 프로그래밍 '속도 계산 메소드 서브함수 , Accelerate 속도 = speed * GearLevel
Sub Accelerate(ByVal iAccelerate As Integer) Select Case iAccelerate 'speed 계산 Case 1 speed = 10 * iAccelerate GearLevel = 1 Case 2 GearLevel = 2 Case 3 speed = 15 * iAccelerate GearLevel = 3 Case 4 speed = 20 * iAccelerate GearLevel = 4 Case 5 GearLevel = 5 Case Else speed = 0 GearLevel = 0 End Select End Sub End Class

10 객체 지향 프로그래밍 5. Bus 클래스를 추가한다. ‘새 항목 추가‘ 대화상자에서 템플릿은 ‘클래스'로 선택하고, 하단의 클래스 이름 항목에는 ‘Bus.vb’를 입력하고, [추가] 버튼을 클릭한다. 6. Car 클래스로 부터 상속받고, 무게 필드 멤버를 추가 Bus 클래스에 안에 작성한다. 그리고 무게당 마력을 계산하기 위해 Bus 클래스 안에 함수 메소드를 작성한다. HorsePower 속성은 Car 클래스의 속성으로 Bus 클래스에서 상속받아 사용하는 속성이다. Public Class Bus 'Car 클래스로부터 상속 Inherits Car '자동차 무게 멤버 Public Weight As Integer '무게당 마력계산 메소드 함수 Function BusAccelerate() As Double Dim WegperHP As Double '무게당 마력 계산 WegperHP = CType(HorsePower, Double) / CType(Weight, Double) Return WegperHP End Function End Class

11 객체 지향 프로그래밍 7. 폼을 설계한다.

12 객체 지향 프로그래밍 8. 폼과 각 컨트롤에 대한 속성값을 설정한다. 객체의 종류 객체 명 속성 및 설정 값 폼 Form1
Text : Bus 명령 버튼 Button1 (Name) : btnRun Text : 실행 Button2 (Name) : btnClose Text : 종료 레이블 Label1 Text : 버스 마력 : Label2 Text : 버스 무게 : Label3 Text : 기어 단계 : Label4 Text : 버스의 무게당 마력 : Label5 Text : 버스의 속력 : 텍스트 박스 TextBox1 (Name) : txtPower Text : TextBox2 (Name) : txtWeight TextBox3 (Name) : txtGear TextBox4 (Name) : txtPW Enable : False TextBox5 (Name) : txtSpeed

13 객체 지향 프로그래밍 9. [실행] 버튼을 더블 클릭하여 btnRun_Click 이벤트 서브 프로시저를 작성한다.
Public Class Form1 Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click '새로운 Bus 객체를 생성, Bus는 Bus 클래스 Dim OurBus As Bus OurBus = New Bus() '버스의 마력, 무게 치환 OurBus.HorsePower = txtPower.Text OurBus.Weight = txtWeight.Text 'Accelerate 메소드를 이용하여 속도계산 OurBus.Accelerate(txtGear.Text) '무게당 마력을 출력한다. txtPW.Text = OurBus.BusAccelerate '버스의 속력을 출력한다. txtSpeed.Text = OurBus.speed End Sub

14 객체 지향 프로그래밍 10. [종료] 버튼을 더블 클릭하여 btnClose_Click 이벤트 서브 프로시저를 작성한다.
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click Application.Exit() End Sub End Class

15 객체 지향 프로그래밍 11. 프로젝트를 실행한다. 12. 프로젝트를 저장한다.
메뉴에서 [파일] →[모두 저장(L)]을 선택하여 프로젝트를 저장한다. 프로젝트 저장 대화상자에서 이름을 “Bus”로, 위치를 “C:\VB예제 \chapter05”로 입력하고, [저장] 버튼을 클릭하면 프로젝트가 저장된다.

16 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 2) 오버라이딩(Overriding)과 오버로딩(Overloading)
부모 클래스로 부터 자식 클래스가 메소드 및 속성 등을 상속받을 때 상속받는 기능이 자식 클래스에서 원하는 기능과 같지 않을 때 자식 클래스에서 부모 클래스의 메소드를 재정의하여 기능을 변경한다. ① 메소드 오버라이딩 부모 클래스에서 정의된 메소드에 대하여 새롭게 구현하는 것이다. 오버라이딩에 관계된 자식 클래스의 수행 코드 생성에 키워드인 Overridable, MustOverride, Overides, NotOverridable를 사용한다. Overridable 키워드는 자식 클래스에 오버라이드 할 수 있는 경우에 사용한다. 부모 클래스의 메소드 멤버에서 Overridable 키워드를 사용한 경우 Public Class BaseClass Public Overridable Sub OverrideMethod()          MessageBox("기초 클래스 OverrideMethod“)   End Sub   ...   Public Sub OtherMethod()          MessageBox("오버라이드 하지 않은 OtherMethod“) End Class 

17 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 MustOverride 키워드는 파생된 모든 자식 클래스에서 반드시 오버라이드 해야 하는 부모 클래스를 생성하는 경우에 사용한다. Overrides 키워드는 상속받은 자식 클래스 안에서 메소드를 부모 클래스 메소드로 대체한다. NotOverridable 키워드는 오버라이드할 수 없을 때 사용한다. Public Class DrivedClass   inherits BaseClass   Public Overrides Sub OverrideMethod()          MessageBox("BaseClass에서 파생된 OverrideMethod“)   End Sub    End Class 

18 예제 프로그램 : 오버라이드 예제 프로그램(OverrideMethod)
객체 지향 프로그래밍 예제 프로그램 : 오버라이드 예제 프로그램(OverrideMethod) 부모 클래스에서 Overridable 키워드를 사용하고, 자식 클래스에서 Overrides 키워드를 사용하여 재정의 메소드를 구현한다. 부모 클래스인 Car에서 속도를 구하는 메소드인 Accelerate는 자식 클래스인 Bus에서 Accelerate 메소드를 그대로 사용하기에는 적합하지 않아서 수정한다. 1. Microsoft Visual Studio의 메뉴에서 [파일(F)]→[새 프로젝트(P)]를 선택하여 Visual Studio 안에 있는 “새 프로젝트” 화면을 연다. ‘새 프로젝트’ 화면에서 화면 좌측에 있는 ‘설치된 템플릿’의 항목에서 ‘Visual Basic’을 선택하고, 중간의 ‘템플릿’ 항목에서는 [Windows Forms 응용 프로그램]을 선택하여 [확인] 버튼을 클릭한다. 2. 새로운 프로젝트가 생성되었으면 새로운 클래스의 생성이 필요하다. 메 뉴에서 [프로젝트(P)] -> [클래스 추가(C)]를 선택하여 Car(Car.vb)와 Bus(Bus.vb) 클래스를 생성한다.

19 객체 지향 프로그래밍 3. Car 클래스 안에 필드 멤버와 생성자를 추가한다. 메소드를 자식 클래스에서 재 정의하기 위해 Accelerate 메소드 앞에 Overridable 키워드를 추가 한다. Public Class Car 'Public speed As Integer '자동차 속도 필드 멤버 Public Property Speed As Integer '프로퍼티 프로시저 Speed 속성 설정-스피트값을 반환 Overridable Sub Accelerate(ByVal iAccelerate As Integer) '속도 계산 메소드 서브 함수 Select Case iAccelerate 'speed 계산 Case 1 Speed = 10 * iAccelerate Case 2 Case 3 Speed = 15 * iAccelerate Case 4 Speed = 20 * iAccelerate Case 5 Case Else Speed = 0 End Select End Sub End Class

20 객체 지향 프로그래밍 4. Car 클래스로 부터 자식 클래스인 Bus 클래스를 작성한다. 부모 클래스의 메소드인 Accelerate를 재정의하기 위해 Accelerate 메소드 앞에 Overrides 키워드를 추가한다. Public Class Bus 'Car 클래스로부터 상속 Inherits Car '속도 계산 메소드 서브함수(재정의 메소드) Overrides Sub Accelerate(ByVal iAccelerate As Integer) Select Case iAccelerate 'speed 계산 Case 1 Speed = 8 * iAccelerate Case 2 Case 3 Speed = 12 * iAccelerate Case 4 Speed = 15 * iAccelerate Case 5 Speed = 18 * iAccelerate Case Else Speed = 0 End Select End Sub End Class

21 객체 지향 프로그래밍 5. 폼을 설계한다. 6. 폼과 각 컨트롤에 대한 속성값을 설정한다. 객체의 종류 객체 명
속성 및 설정 값 Form1 Text : 버스 명령 버튼 Button1 (Name) : btnRun Text : 오버라이딩 실행 Button2 (Name) : btnClose Text : 종료 레이블 Label1 Text : 버스의 기어 단계 : Label2 Text : 버스의 속도 : 텍스트 박스 TextBox1 (Name) : txtGear Text : TextBox2 (Name) : txtSpeed Enable : False

22 객체 지향 프로그래밍 7. [오버라이딩 실행] 버튼을 더블 클릭하여 btnRun_Click 이벤트 서브 프로시저를 작성한다.
Public Class Form1 Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click '새로운 Bus 객체를 생성 : Bus는 Bus 클래스 Dim OurBus As Bus OurBus = New Bus() 'Accelerate 메소드를 이용하여 속도계산 OurBus.Accelerate(txtGear.Text) '버스의 속도(speed속성) 값을 출력한다 txtSpeed.Text = OurBus.Speed '기어단계설정 값 확인 If txtGear.Text > 5 Or txtGear.Text < 0 Then MessageBox.Show("버스의 기어단계설정 값이 잘못되었음!") Return End If End Sub End Class

23 객체 지향 프로그래밍 8. [종료] 버튼을 더블 클릭하여 btnClose_Click 이벤트 서브 프로시저를 작성한다.
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click Application.Exit() End Sub End Class

24 객체 지향 프로그래밍 9. 프로젝트를 실행한다. 10. 프로젝트를 저장한다.
버스의 기어 단계를 입력하고, [실행] 버튼을 클릭한다. 10. 프로젝트를 저장한다. 메뉴에서 [파일] →[모두 저장(L)]을 선택하여 프로젝트를 저장한다. 프로젝트 저장 대화상자에서 이름을 “OverrideMethod”로, 위치를 “C:\VB 예제\chapter05”로 입력하고, [저장] 버튼을 클릭하면 프로젝트가 저장된 다.

25 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 ② 메소드 오버로딩(Overloading)
메소드 오버로딩은 같은 이름을 가진 메소드에 서로 다른 매개변수의 데이터 형식과 개수를 정의한 것이다. 같은 이름을 가지지만 데이터의 형식과 개수가 서로 다른 메소드를 정의함으로서 프로그램 코딩과 이해성을 쉽게 하는 기능이다. 다음 예는 원의 면적을 계산하는 메소드를 오버로드 하는 방법 Integer, Single, Double 정보에 다른 형식을 할당하는 코드 Overloads Function RadiusAreaCalculate(ByVal radius As Integer) As Integer         '반경을 매개변수로 받아서 원주율(radius * radius) 계산         '원의 면적 계산(원주율 * PI)          Return radius * radius * Math.PI End Function Overloads Function RadiusAreaCalculate(ByVal radius As Single) As Single Overloads Function RadiusAreaCalculate(ByVal radius As Double) As Double Return radius * radius * Math.PI

26 예제 프로그램 : 오버로딩 예제 프로그램(MethodOverloading)
객체 지향 프로그래밍 예제 프로그램 : 오버로딩 예제 프로그램(MethodOverloading) 부모 클래스에서 Overloads 키워드를 사용하여 같은 이름인 3개의 메소드를 정의한다. 자식 클래스에서 각 데이터 형식에 따라 사용하도록 구현한다. 1. Microsoft Visual Studio의 메뉴에서 [파일(F)]→[새 프로젝트(P)]를 선택하여 Visual Studio 안에 있는 “새 프로젝트” 화면을 연다. ‘새 프로젝트’ 화면에서 화면 좌측에 있는 ‘설치된 템플릿’의 항목에서 ‘Visual Basic’을 선택하고, 중간의 ‘템플릿’ 항목에서는 [Windows Forms 응용 프로그램]을 선택하여 [확인] 버튼을 클릭한다. 2. 새로운 프로젝트가 생성되었으면 새로운 클래스의 생성이 필요하다. 메 뉴에서 [프로젝트(P)] -> [클래스 추가(C)]를 선택하여 Circle(Circle.vb) 클래스를 생성한다.

27 객체 지향 프로그래밍 3. Circle 클래스 안에 메소드 함수를 추가한다. Overloads 키워드를 사용하여 같은 이름인 3개의 메소드를 정의한다. Public Class Circle Overloads Function RadiusAreaCalculate(ByVal radius As Integer) As Integer '반경을 매개변수로 받아서 원주율(radius * radius) 계산 '원의 면적 계산(원주율 * PI) Return radius * radius * Math.PI End Function Overloads Function RadiusAreaCalculate(ByVal radius As Single) As Single Overloads Function RadiusAreaCalculate(ByVal radius As Double) As Double End Class

28 객체 지향 프로그래밍 4. 폼을 설계한다.

29 객체 지향 프로그래밍 5. 폼과 각 컨트롤에 대한 속성값을 설정한다. 객체의 종류 객체 명 속성 및 설정 값 폼 Form1
Text : 원 면적 계산 오버로딩 명령 버튼 Button1 (Name) : btnRun Text : 오버라이딩 실행 Button2 (Name) : btnClose Text : 종료 레이블 Label1 Text : 원의 반지름 : Label2 Text : 데이터 형식 : Label3 Text : 원의 면적 : 텍스트 박스 TextBox1 (Name) : txtRadius Text : TextBox2 (Name) : txtResult Enable : False 콤보 박스 ComboBox1 (Name) : cbType DropDownStyle : DropDownList Items : Integer Single Double

30 객체 지향 프로그래밍 6. [실행] 버튼을 더블 클릭하여 btnRun_Click 이벤트 서브 프로시저를 작성한다.
Public Class Form1 Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click '새로운 Circle 객체를 생성 : 'Circle은 Circle 클래스 Dim MyCircle As Circle MyCircle = New Circle() '메소드 오버로딩을 이용하여 원의 면적계산 Select Case cbType.SelectedItem Case "Integer" 'Integer 형식을 리턴하는 RadiusAreaCalculate 메소드 호출 txtResult.Text = MyCircle.RadiusAreaCalculate(Integer.Parse(txtRadius.Text)) Case "Single" 'Single 형식을 리턴하는 RadiusAreaCalculate 메소드 호출 txtResult.Text = MyCircle.RadiusAreaCalculate(Single.Parse(txtRadius.Text)) Case "Double" 'Double 형식을 리턴하는 RadiusAreaCalculate 메소드 호출 txtResult.Text = MyCircle.RadiusAreaCalculate(Double.Parse(txtRadius.Text)) End Select End Sub End Class

31 객체 지향 프로그래밍 7. [종료] 버튼을 더블 클릭하여 btnClose_Click 이벤트 서브 프로시저를 작성한다.
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click Application.Exit() End Sub

32 객체 지향 프로그래밍 8. 프로젝트를 실행한다. 9. 프로젝트를 저장한다.
원의 반지름을 입력하고, 데이터 형식을 선택하여 [실행] 버튼을 클릭한다. 9. 프로젝트를 저장한다. 메뉴에서 [파일] →[모두 저장(L)]을 선택하여 프로젝트를 저장한다. 프로젝트 저장 대화상자에서 이름을 “OverrideMethod”로, 위치를 “C:\VB 예제\chapter05”로 입력하고, [저장] 버튼을 클릭하면 프로젝트가 저장된 다.

33 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 3) 그림자 메소드(Shadow Method)
그림자 메소드는 부모 클래스에 정의된 특정 필드와 이름을 자식 클래 스의 필드에서 정의하고자 할 때 사용한다. 자식 클래스의 해당 메소드에 shadow 키워드를 지정한다. 다음 예는 부모 클래스 BaseClass에서 color로 선언된 Integer 형식의 필드 멤버를 자식 클래스 DerivedClass 에서 같은 이름의 color 필드 멤버를 double 형식으로 재정의 한다. Class BaseClass      Public color As Integer      ... End Class Class DerivedClass      Inherits BaseClass      Public Shadows color As Double

34 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 4) MyClass 키워드 사용
오버라이드(재정의)된 메소드나 속성을 호출하지 않고, 현재 클래스에서 정의된 메소드나 클래스를 호출한다. 다음 예는 MyBase 키워드를 사용하여 클래스 내에서 정의된 메소드를 호출하는 코드 Public Class TheBaseClass     '메소드 오버라이딩     Public Overridable Sub OverrideMethod( )          MessageBox.Show("기초 OverrideMethod")     End Sub     ...     Public Sub OtherMethod( )          '파생 메소드 호출          OverrideMethod( )          '현재 클래스의 메소드 호출          MyClass.OverrideMethod( )     End Sub    End Class

35 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 MyClass 키워드와 Me 키워드의 차이점
Public Class TheDrivedClass     Inherits TheBaseClass         Public Overrides Sub OverrideMethod( ) '메소드 오버라이딩         MessageBox.Show("파생 OverrideMethod")     End Sub End Class Module Module1     Sub Main( )         Dim DClass As TheDrivedClass '새로운 DClass 객체를 생성         DClass = New TheDrivedClass()         DClass.OTherMethod( ) '메소드 호출 End Module MyClass 키워드와 Me 키워드의 차이점 키워드 내 용 MyClass 자식의 클래스에서 정의된 메소드를 호출한다. 부모 클래스에서 정의하고, 자식 클래스에서 재정의된 클래스는 적용되지 않는다. Me 자식 클래스에서 재정의(Override)된 메소드를 호출한다.

36 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 (8) 인터페이스(Interface)
인터페이스는 실제 구현보다는 클래스가 제공하는 서비스를 명시하는 데 사용되며, 일종의 계약서라고 할 수 있다. 한 클래스가 특정 인터페이스를 구현한다는 것은 인터페이스에서 정의하는 기능을 구현하는 것이다. 인터페이스에서 사용할 수 있는 멤버는 프로퍼티, 메소드, 이벤트가 있으며, 상수, 필드, 생성자, 공유 멤버는 인터페이스에서 사용할 수 없다. 다음 예는 인터페이스를 정의하는 간단한 예제 Interface IClassInterface     Property mbrProperty() As String     Sub mbrSub()     Function mbrFunction() As Integer     Event mbrEvent() End Interface

37 예제 프로그램 : 인터페이스 예제 프로그램(InterfaceInheritance)
객체 지향 프로그래밍 예제 프로그램 : 인터페이스 예제 프로그램(InterfaceInheritance) 인터페이스를 이용하여 다중 상속을 구현한다. Add 메소드를 AddCalc 인터페이스로, Minus 메소드를 MinusCalc 인터페이스로 구현하여 더하기와 빼기를 하는 클래스를 정의한다. 1. Microsoft Visual Studio의 메뉴에서 [파일(F)]→[새 프로젝트(P)]를 선택하여 Visual Studio 안에 있는 “새 프로젝트” 화면을 연다. ‘새 프로젝트’ 화면에서 화면 좌측에 있는 ‘설치된 템플릿’의 항목에서 ‘Visual Basic’을 선택하고, 중간의 ‘템플릿’ 항목에서는 [Windows Forms 응용 프로그램]을 선택하여 [확인] 버튼을 클릭한다. 2. 새로운 프로젝트가 생성되었으면 새로운 클래스의 생성이 필요하다. 메 뉴에서 [프로젝트(P)] -> [클래스 추가(C)]를 선택하여 Calculate(Calculate.vb) 클래스를 생성한다.

38 객체 지향 프로그래밍 3. AddCalc 인터페이스로 Add() 메소드를 선언하고, MinusCalc 인터페이스로 Minus() 메소드를 선언한다. Calculate 클래스 안에 Implements로 다중 상속을 하고 있으며, 2개의 메소드 함수인 Add(), Minus()를 추가한다. Interface AddCalc 'AddCalc 인터페이스로 Add 메소드 선언 Function Add(ByVal x As Integer, ByVal y As Integer) As Integer End Interface Interface MinusCalc 'MinusCalc 인터페이스로 Minus 메소드 선언 Function Minus(ByVal x As Integer, ByVal y As Integer) As Integer Public Class Calculate Implements AddCalc, MinusCalc '인터페이스 다중 상속 'Add 메소드 구현 Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer _ Implements AddCalc.Add Return x + y End Function ‘Minus 메소드 구현 Public Function Minus(ByVal x As Integer, ByVal y As Integer) As Integer _ Implements MinusCalc.Minus Return x - y End Class

39 객체 지향 프로그래밍 4. 폼을 설계한다.

40 객체 지향 프로그래밍 5. 폼과 각 컨트롤에 대한 속성값을 설정한다. 객체의 종류 객체 명 속성 및 설정 값 폼 Form1
Text : 인터페이스 상속 명령 버튼 Button1 (Name) : btnRun Text : 실행 Button2 (Name) : btnClose Text : 종료 텍스트 박스 TextBox1 (Name) : txtNum1 Text : 콤보 박스 ComboBox1 (Name) : cbType DropDownStyle : DropDownList Items : + - TextBox2 (Name) : txtNum2 TextBox3 (Name) : txtResult Enable : False 레이블 Label1 Text : =

41 객체 지향 프로그래밍 6. [실행] 버튼을 더블 클릭하여 btnRun_Click 이벤트 서브 프로시저를 작성한다.
Public Class Form1 Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click Dim Calc As Calculate '객체 생성 Calc = New Calculate() Dim Acalc As AddCalc '인터페이스 객체 생성 Acalc = Calc Dim Mcalc As MinusCalc Mcalc = Calc Select Case cbType.SelectedItem ' "+", "-" 계산 선택 Case "+" ‘ "+" 계산 : Add 메소드 호출 txtResult.Text = Acalc.Add(Integer.Parse(txtNum1.Text), Integer.Parse(txtNum2.Text)) Case "-" ‘ "-" 계산 : Add 메소드 호출 txtResult.Text = Mcalc.Minus(Integer.Parse(txtNum1.Text), Integer.Parse(txtNum2.Text)) End Select End Sub End Class

42 객체 지향 프로그래밍 7. [종료] 버튼을 더블 클릭하여 btnClose_Click 이벤트 서브 프로시저를 작성한다.
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click Application.Exit() End Sub

43 객체 지향 프로그래밍 8. 프로젝트를 실행한다. 9. 프로젝트를 저장한다.
값을 입력하고, 콤보 박스에서 ‘+’와 ‘-’를 선택하여 [실행] 버튼을 클릭한다. 9. 프로젝트를 저장한다. 메뉴에서 [파일] →[모두 저장(L)]을 선택하여 프로젝트를 저장한다. 프로젝트 저장 대화상자에서 이름을 “InterfaceInheritance”로, 위치를 “C:\VB예제\chapter05”로 입력하고, [저장] 버튼을 클릭하면 프로젝트가 저장된다.

44 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 (9) 대리자(Delegate)
대리자는 다른 개체의 메서드를 참조하는 개체이다. 함수 포인터와 달리 System.Delegate 클래스를 기반으로 하는 참조 형식이다. 대리자는 공유 메서드(클래스의 특정 인스턴스 없이도 호출할 수 있는 메서드)와 인스턴스 메서드를 모두 참조할 수 있다. Delegate 문의 기본 형식 접근 지정자 : 선택 요소이며, 대리자에 엑세스할 수 있는 접근 지정자이다. 접근 지정자는 Public, Protected, Friend, Private가 있다. name : 필수 요소로 대리자 형식의 이름이다. 타입매개변수 : 선택 요소이며, 대리자에 대한 형식 매개변수 목록이다. Type : Function 프로시저를 지정하는 경우는 필수 요소이며, 반환값의 데이터 형식이다. [접근지정자] Delegate [Sub | Function] name [(Of 타입매개변수)] [As Type]

45 예제 프로그램 : 대리자 예제 프로그램(Delegate)
객체 지향 프로그래밍 예제 프로그램 : 대리자 예제 프로그램(Delegate) Delegate 를 사용하여 두 수에 대한 더하기와 빼기 연산을 수향하고, 결과를 반 환하는 대리자를 선언한다. DelegateFunction 서브 프로시저는 이 형식의 대리자 인스턴스를 사용하고, 이를 통하여 2개의 수를 연산한다. 1. Microsoft Visual Studio의 메뉴에서 [파일(F)]→[새 프로젝트(P)]를 선택하여 Visual Studio 안에 있는 “새 프로젝트” 화면을 연다. ‘새 프로젝트’ 화면에서 화면 좌측에 있는 ‘설치된 템플릿’의 항목에서 ‘Visual Basic’을 선택하고, 중간의 ‘템플릿’ 항목에서는 [Windows Forms 응용 프로그램]을 선택하여 [확인] 버튼을 클릭한다.

46 객체 지향 프로그래밍 2. Form1.vb에 다음의 코드를 추가한다. Public Class Form1
'출력 선택에 사용하는 변수 Public bo As Boolean '대리자 선언을 numAdd, numSubtract 함수의 유형과 같은 형식으로 정의. Delegate Function MathOper(ByVal x As Double, ByVal y As Double) As Double Function numAdd(ByVal x As Double, ByVal y As Double) As Double Return x + y End Function Function numSubtract(ByVal x As Double, ByVal y As Double) As Double Return x - y Sub DelegateFunction(ByVal x As Double, ByVal y As Double, ByVal op As MathOper) '대리자 객체 선언(op As MathOper) Dim calNum As Double '대리자를 통해 numAdd, numSubtract 메서드 호출 calNum = op.Invoke(x, y) If bo Then txtResult.Text += "대리자 연산 Subtract : " + CStr(calNum) + vbCrLf Else txtResult.Text += "대리자 연산 Add : " + CStr(calNum) + vbCrLf End If bo = True End Sub End Class

47 객체 지향 프로그래밍 3. 폼을 설계한다.

48 객체 지향 프로그래밍 4. 폼과 각 컨트롤에 대한 속성값을 설정한다. 객체의 종류 객체 명 속성 및 설정 값 폼 Form1
Text : 대리자 이벤트 레이블 Label1 Text : 숫자 1 Label2 Text : 숫자 2 텍스트 박스 TextBox1 (Name) : txtNum1 Text : TextBox2 (Name) : txtNum2 명령 버튼 Button1 (Name) : btnCalc Text : 대리자 연산 TextBox3 (Name) : txtResult MultiLine : True

49 객체 지향 프로그래밍 5. [대리자 연산] 버튼을 더블 클릭하여 btnCalc_Click 이벤트 서브 프로시저를 작성한다.
Private Sub btnCalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalc.Click 'Double 타입의 인수와 AddressOf 연산자를 이용하여 numAdd 함수를 가르키는 '함수 대리자를 인수로 가지는 대리자를 호출 DelegateFunction(txtNum1.Text, txtNum2.Text, AddressOf numAdd) 'Double 타입의 인수와 AddressOf 연산자를 이용하여 numSubtract 함수를 가르키는 DelegateFunction(txtNum1.Text, txtNum2.Text, AddressOf numSubtract) End Sub

50 객체 지향 프로그래밍 6. 프로젝트를 실행한다. 7. 프로젝트를 저장한다.
두 개의 값을 입력하고, [대리자 연산] 버튼을 클릭한다. 7. 프로젝트를 저장한다. 메뉴에서 [파일] →[모두 저장(L)]을 선택하여 프로젝트를 저장한다. 프로젝트 저장 대화상자에서 이름을 “Delegate”로, 위치를 “C:\VB예제 \chapter05”로 입력하고, [저장] 버튼을 클릭하면 프로젝트가 저장된다.

51 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 (10) 익명 형식(Anonymous Types)
익명 형식은 데이터 형식에 대한 클래스 정의를 작성하지 않고, 개체 를 만들 수 있는 방법이다. 컴파일러가 대신하여 클래스를 생성한다. 이 클래스는 사용할 수 있는 이름이 없고, Object에서 직접 상속하며, 개체를 선언할 때 지정하는 속성을 포함한다. 데이터 형식의 이름이 지정되지 않기 때문에 해당 형식을 익명 형식(Anonymous Types)이라고 한다. 다음 예는 변수 student를 Name 및 Age라는 두 개의 속성을 가지는 익명 형식의 인스턴스로 선언한다. Dim student = New With {Key .Name = "홍길동", .Age = 21}

52 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 다음 예는 students 테이블은 각각 많은 속성이 있는 학생 개체의 목록이다. nameAgeQuery 변수는 실행할 경우 Name 과 Age인 두 개의 속성을 가지는 익명 형식의 인스턴스 컬렉션을 반환하는 쿼리 정의를 할당한다. 또한, nameGradeQuery 변수는 실행할 경우 Name 및 Grade라는 두 개의 속성을 가지는 익명 형식의 인스턴스 컬렉션을 반환하는 쿼리 정의를 할당한다. Dim nameAgeQuery = From stud In students Select stud.Name, stud.Age Dim nameGradeQuery = From stud In students Select stud.Name, stud.Grade

53 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 ① 익명 형식 선언
익명 형식의 인스턴스 선언에서는 이니셜라이저 목록을 사용하여 해당 형식의 속성을 지정한다. 익명 형식을 선언할 때는 속성만 지정할 수 있고, 메서드나 이벤트와 같은 다른 클래스 요소는 지정할 수 없다. 다음 예에서 student1은 Name과 Age인 두 개의 속성을 가지는 익명 형식의 인스턴스이다. 익명 형식의 인스턴스를 선언하는 것은 개체 이니셜라이저를 사용하여 명명된 형식의 인스턴스를 선언하는 것과 유사하다. Dim student1 = New With {.Name = "김동길", .Age = 23} ' -or- Dim student2 = New With {Key.Name = "한광수", Key.Age = 20} Dim student3 = New Student With {.Name = "김민기", .Age = 22}

54 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 ② 키 속성
키(Key) 속성은 키가 아닌 속성과 기본적인 면에서 차이가 난다. 두 인스턴스가 같은지 확인하기 위해 키 속성의 값만 비교한다. 키 속성 값은 읽기 전용이며 변경할 수 없다 익명 형식의 인스턴스는 같은 익명 형식의 인스턴스인 경우에만 같다(Equals() 사용). 컴파일러에서는 다음 조건에 해당하는 경우 두 인스턴스를 같은 형식의 인스턴스로 처리한다. 동일한 어셈블리에서 선언된다. 해당 속성이 동일한 이름과 유추된 형식을 갖고, 같은 순서로 선언된다. 이름을 비교할 때 대/소문자를 구분하지 않는다. 각 인스턴스에서 동일한 속성이 키 속성으로 표시된다. 각 선언에서 한 개 이상의 속성이 키 속성이다.

55 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 키 속성이 없는 익명 형식의 인스턴스는 자신하고만 같다.
다음 예에서 두 구문 stud1, stud2에 있는 속성 값은 같지만 자신하고만 같기 때문에 False를 출력한다. 'stud과 stud2는 키 값을 가지고 있지 않다. Dim stud1 = New With {.Name = "김민주", .Age = 21} Dim stud2 = New With {.Name = "김민주", .Age = 21} Console.WriteLine(prod1.Equals(prod2)) //False Console.WriteLine(prod1.Equals(prod1)) //True

56 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 (11) 개체 이니셜라이저(Object Initializers)
개체 이니셜라이저는 단일 식으로 복잡한 개체의 속성을 지정할 수 있 다. 개체 이니셜라이저를 사용하면 명명된 형식과 익명 형식의 인스턴스를 만들 수 있다. 명명된 형식과 익명 형식의 인스턴스 선언은 거의 동일해 보일 수 있지만 그 결과는 다르며, 각각의 범주에는 해당하는 기능과 제한 사항이 있다. 다음 예는 개체 이니셜라이저 목록을 사용하여 명명된 클래스 Customer의 인스턴스를 선언하고, 초기화하는 방법 Dim namedCust = New Customer With {.Name = "홍길동"}

57 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 (12) 람다 식(Lambda Expression)
람다 식은 대리자 형식이 가능한 모든 곳에서 사용할 수 있는 이름이 없는 함수 또는 서브루틴이다. 람다 식은 함수 또는 서브루틴이며, 한 줄이나 여러 줄로 구성된다. 또한 현재 범위의 값을 람다 식에 전달할 수 있다. 표준 함수 또는 서브루틴을 만드는 경우와 마찬가지로, Function 또는 Sub 키워드를 사용하여 람다 식을 만든다. 다음 예는 인수를 점증적으로 늘리고, 값을 반환하는 람다 식이다. 한 줄과 여러 줄로 구성된 Function 람다 식 구문 Dim increment1 = Function(x) x + 1 Dim increment2 = Function(x) Return x + 2 End Function ‘정수 인수를 전달하여 람다식(increment1)을 호출 Console.WriteLine(increment1(1)) //값 2 출력 ‘정수 인수를 전달하여 람다식(increment2)을 호출 Console.WriteLine(increment2(2)) //값 4 출력

58 객체 지향 프로그래밍 5.2 객체 지향 프로그래밍 다음의 예는 콘솔에 값을 쓰는 람다 식이다.
한 줄과 여러 줄로 구성된 Sub 람다 식 구문 Dim writeline1 = Sub(x) Console.WriteLine(x) Dim writeline2 = Sub(x) Console.WriteLine(x) End Sub writeline1("Hello") //“Hello" 출력 writeline2("World") //“World" 출력


Download ppt "5 장 객체 지향 프로그래밍 5.1 객체 지향 프로그래밍의 개념 5.2 객체 지향 프로그래밍 2018-12-09."

Similar presentations


Ads by Google