C# 10장. 참조형.

Slides:



Advertisements
Similar presentations
Transaction ㅇ Transaction 을 직접 구현하려면, 까다로운 설계와 복잡한 코드를 필요로 하고 수정에 공수가 많이 들게 된다. ㅇ 스프링에서 제공하는 Transaction Manager 를 사용하여 쉽고 간편하게 어려운 트랜잭션을 해결할 수 있다. xml.
Advertisements

멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
어서와 Java는 처음이지! 제3장선택과 반복.
11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현.
14. 위피 게임: 가위바위보 게임 초기에 점수=0 처음 이기면 10 점 그 다음부터 이기면 점수=현재 점수*2 지면
10. 예외 처리.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
2장 닷넷 프레임워크.
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
7장 배열 ②.
명품 JAVA Programming 제 13 장 스레드와 멀티태스킹.
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
제6장 제어(Control) 6.1 구조적 프로그래밍(Structured Programming)
C# 03장. 프로그램 구성 요소와 데이터형.
C# 05장. 메소드와 인자.
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
제7장 제어구조 I – 식과 문장.
[ 단원 08 ] 예외처리와 스레드.
명품 JAVA Essential.
[INA470] Java Programming Youn-Hee Han
10장 객체-지향 프로그래밍 II ©창병모.
8장 자바 입출력.
Power Java 제10장 배열.
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
01. 직렬화와 역직렬화에 대하여 객체의 직렬화 직렬화와 역직렬화
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 03. 클래스의 기본.
명품 JAVA Essential.
명품 Java Programming.
최용술 장 Thread 최용술
Chap07 예외 처리 7.1 예외의 개요 7.2 예외 관련 클래스 7.3 예외 처리.
Hadoop 김연왕
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
이벤트(Event) 처리하기 윈도우 프로그램에서는 이벤트를 통하여 실행 중인 프로그램에게 사용자의 요구사항을 알린다.
2010학년도 2학기 객체지향의 이해.
DataScience Lab. 박사과정 김희찬 (월)
인터페이스(Interfaces) 강원대학교.
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수.
김 정 석 Web Programming 김 정 석
주소록 프로그램.
6장 객체-지향 설계 ①.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
12 검색.
IT CookBook, 자바로 배우는 쉬운 자료구조
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Java 8장. 상속 public class SumTest {
6장 객체-지향 설계 ①.
DataScience Lab. 박사과정 김희찬 (월)
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
WAP Java Seminar
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
C# 09장. 상속성.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
프로그래밍 개론 Ⅰ 제 1장 . 서론 ①.
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
Chapter3 : 객체지향의 개념 3.1 객체지향(object-oriented)과
Chap02 객체 지향 개념 2.1 객체지향(object-oriented)과 절차지향(procedural-oriented)
JA A V W. 04.
CACM 구현 public class CACM { public CACM(File file)
자바 5.0 프로그래밍.
7강. 객체지향 프로그램의 본질 메소드 프로그래밍의 한계 객체의 개념 및 클래스의 이해
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
컴퓨터 프로그래밍: 실습 1 제 1장 . 서론.
Java 5장. 객체지향 개념 public class SumTest {
11장 다형성과 추상 클래스, 인터페이스 Section 1 객체의 형 변환 Section 2 연산자 Section 3 다형성
C# 09장. 클래스와 객체.
Presentation transcript:

C# 10장. 참조형

학습 목표 참조형의 주요한 특징을 이해하고 응용해서 사용한다 서로 다른 형식 사이의 형 변환의 가능성을 결정할 수 있다 참조형 사이의 데이터 형 변환을 이해할 수 있다 값형과 참조형 사이의 박싱과 언박싱 변환을 이해하고 변환할 수 있 다.

목차 참조형 변수 데이터 형 변환

1. 참조형 변수 참조형 변수 - 변수는 스택 영역에 저장 - 실제 데이터는 메모리의 힙 영역에 저장 - 변수는 스택 영역에 저장 - 실제 데이터는 메모리의 힙 영역에 저장 클래스도 일종의 참조형으로 분류된다. 클래스를 인스턴스화 해서 변수에 할당 == 참조형 변수 선언과 같다.

null을 참조형 변수에 할당하면 확보되어 있던 메모리가 해제된다. 1. 참조형 변수 참조형 변수의 선언과 해제 변수는 스택영역에 저장되고, 실제 데이터는 힙영역에 저장된다. 스택에 저장되는 값은 실제 데이터가 저장된 힙영역의 주소값이다. 메모리의 해제 방법은 참조형 변수에 null을 할당하면 된다. <참조형 선언및 멤버 접근 예제> class Coordinate { public int x = 0 ; } … Coordinate c = new Coordinate() ; c.x = 1; 참조형 변수선언 및 메모리할당 참조형 변수 c를 선언하고 실제 데이터가 저장될 힙 영역의 메모리 확보는 new 키워드를 통해서 이루어 지며, 생성자(Coordinate())를 통해서 초기화된다. 참조형의 메모리 해제 null을 참조형 변수에 할당하면 확보되어 있던 메모리가 해제된다. <참조형 메모리해제 예제> Coordinate c = new Coordinate() ; c = null ;

1. 참조형 변수 참조형 변수 예제 using System; class Coordinate { public int x; public int y; } class ConsoleApplication static void Main(string[] args) Coordinate c = new Coordinate(); // 참조형 변수 선언 및 메모리 할당 c.x = 1; c.y = 2; // 참조형 변수의 멤버 접근 Console.WriteLine("c = {0}, {1}", c.x, c.y); (11행) 객체 생성 측면에서 Cordinate 클래스로 변수 c를 선언 후 new 키워드를 사용해서 객체 선언 클래스를 데이터형 측면으로 보면, Cordinate 형 변수 c를 선언하고 힙 영역의 메모리를 할당 즉, 객체 생성은 데이터형의 선언, 메모리 확보와 같다.

두 객체의 저장된 값은 같으나 참조형 데이터 값은 없다. 굳이 비교를 하게 되면 서로 다른 값으로 인식한다. 1. 참조형 변수 값형과 참조형의 비교 값형의 경우 ==와 !=의 연산자로 값을 비교한다. 참조형의 값은 ==와 !=로 비교할 수 없다. ==혹은 !=연산자는 단지 참조형 변수의 힙영역 주소값 만을 비교하게 된다. <예제> class Coordinate { public int x ; } … Coordinate c1 = new Coordinate(); Coordinate c2 = new Coordinate(); c1.x = 1 ; c2.x = 1 ; if(c1= = c2) Console.WriteLine(“c1==c2”); else Console.WriteLine(“c1!=c2”); 두 객체의 멤버에 같은 값을 할당한다. 두 객체의 저장된 값은 같으나 참조형 데이터 값은 == 연산자로 비교할 수 없다. 굳이 비교를 하게 되면 서로 다른 값으로 인식한다.

1. 참조형 변수 값형과 참조형 변수(주소) 비교 예제 using System; class Coordinate { public int x; public int y; } class ConsoleApplication static void Main(string[] args) Coordinate c1 = new Coordinate(); Coordinate c2 = new Coordinate(); c1.x = 1; c1.y = 2; c2.x = 1; c2.y = 2; Console.WriteLine("c1 = {0}, {1}", c1.x, c1.y); Console.WriteLine("c2 = {0}, {1}", c2.x, c2.y); if (c1 == c2) // 참조형 변수 비교 Console.WriteLine("c1 == c2"); else Console.WriteLine("c1 != c2");

1. 참조형 변수 값형과 참조형 값(실제 값) 비교 예제 using System; class Coordinate { public int x; public int y; } class ConsoleApplication static void Main(string[] args) Coordinate c1 = new Coordinate(); Coordinate c2 = new Coordinate(); c1.x = 1; c1.y = 2; c2.x = 1; c2.y = 2; Console.WriteLine("c1.x c1.y = {0}, {1}", c1.x, c1.y); Console.WriteLine("c2.x c2.y = {0}, {1}", c2.x, c2.y); if (c1.x == c2.x) // 참조형 값 비교 Console.WriteLine("c1.x == c2.x"); else Console.WriteLine("c1.x != c2.x");

c1 c2 1. 참조형 변수 같은 객체에 대한 다중 참조(참조형 변수 복사: 주소 복사) 스택영역 힙영역 x y 1 2 using System; class Coordinate { public int x; public int y; } class ConsoleApplication static void Main(string[] args) Coordinate c1 = new Coordinate(); Coordinate c2; //Coordinate 형 변수 c2 선언 c1.x = 1; c1.y = 2; c2 = c1; // 복사 Console.WriteLine("c1.x, c1.y = {0}, {1}", c1.x, c1.y); Console.WriteLine("c2.x, c2.y = {0}, {1}", c2.x, c2.y); if (c1 == c2) // 참조형 변수 비교(주소 비교) Console.WriteLine("c1 == c2"); else Console.WriteLine("c1 != c2"); 스택영역 힙영역 x y c1 1 2 c2 (15행) c1 이 가리키는 주소를 c2에 복사함

같은 객체에 대한 다중 참조(참조형 데이터 변경) 1. 참조형 변수 같은 객체에 대한 다중 참조(참조형 데이터 변경) using System; class Coordinate { public int x; public int y; } class ConsoleApplication static void Main(string[] args) Coordinate c1 = new Coordinate(); Coordinate c2; c1.x = 1; c1.y = 2; c2 = c1; Console.WriteLine("c1.x, c1.y = {0}, {1}", c1.x, c1.y); Console.WriteLine("c2.x, c2.y = {0}, {1}", c2.x, c2.y); c2.x = 10; // 멤버의 값 변경 c2.y = 20; C1과 C2는 같은 곳을 참조 하므로 x,y의 값을 변경 후 결과 값은 같다.

2. 데이터 형 변환 기반클래스와 파생 클래스형 간의 형 변환 파생 클래스형을 기반 클래스형으로 형 변환 암시적으로 형 변환됨 파생클래스->기반클래스로의 변환은 암시적 가능 기반클래스->파생클래스로의 변환은 명시적으로 변환해야 가능 데이터 호환이 되지 않을 때는 InvalidCastException발생 <예제> class Vehicle { } class Car : Vehicle … Vehicle veh = new Vehicle(); Car car = new Car(); Vehicle a = car ; Car b = (Car) a ; 파생 클래스형을 기반 클래스형으로 형 변환 암시적으로 형 변환됨 기반 클래스형을 파생 클래스형으로 형 변환 명시적으로 형 변환해야 함

2. 데이터 형 변환 참조형 데이터 형 변환 using System; class Vehicle { } class Car : Vehicle class ConsoleApplication static void Main(string[] args) Vehicle vehicle = new Vehicle(); //기반 클래스인 Vehicle형 변수 vehicle 선언 및 객체 생성 Car car = new Car(); //v파생 클래스인 Car 형 변수 car를 선언 및 객체 생성 Vehicle a = car; // Child to Parent 형 변환 // a : Vehicle 형 변수, car : Car 형 변수 //암시적 형변환이 이루어짐: car 가 대입되기 전에 Vehicle형으로 Car b = (Car)a; // Parent to Child 형 변환 (14행) : 파생에서 기반으로 변환하는 명시적 형 변환 (15행) : 기반에서 파생으로 변환하는 암시적 형 변환

2. 데이터 형 변환 참조형 데이터 형 변환 (15행) 형 변환 없이 복사(대입) 시 : 에러 발생 using System; class Vehicle { } class Car : Vehicle class ConsoleApplication static void Main(string[] args) Vehicle vehicle = new Vehicle(); Car car = new Car(); Vehicle a = car; // Child to Parent 형변환 Car b = a; // Parent to Child 형변환 //Car b = (Car)a; // Parent to Child 형변환 (15행) 형 변환 없이 복사(대입) 시 : 에러 발생

2. 데이터 형 변환 참조형 데이터 형 변환 using System; class Vehicle { } { } class Car : Vehicle class ConsoleApplication { static void Main(string[] args) Vehicle vehicle = new Vehicle(); Car car = new Car(); Vehicle a = car; // Child to Parent 형변환 try Car b = (Car)a; // Parent to Child 형변환 Console.WriteLine("Vehicle이 Car로 형 변환"); } catch (InvalidCastException e) Console.WriteLine(e.Message); (15행) 실행할 때 캐스트 연산자가 데이터 형을 확인한다. 이때 데이터 호환이 되지 않는다면 예외를 발생 시킨다. 발생하는 예외는 InvalidCastException 이다. 앞의 예에서 try … catch 문을 추가해서 예외 처리를 했다.

2. 데이터 형 변환 is 연산자 참조형 사이의 형 변환을 하고자 할 때 데이터 형이 다르면 InvalidCastException을 이용해서 예외 처리를 했지만 is 연산자를 사용하면 예외 상황을 비켜가게 할 수도 있다. is 연산자는 형 변환을 하지 않고 객체의 데이터 형을 테스트 하는데 유용하다.

2. 데이터 형 변환 is 연산자 car 참조형 변수가 Vehicle형과 호환 가능한 형태인지 조사 데이터 형 사이의 호환성을 테스트하는 데 사용 <예제> class Vehicle { } class Car : Vehicle … Vehicle veh = new Vehicle(); Car car = new Car(); if( car is Vehicle) }else car 참조형 변수가 Vehicle형과 호환 가능한 형태인지 조사 호환가능하면 true, 호환가능하지 않으면 false return

2. 데이터 형 변환 is 연산자의 사용 using System; class Vehicle { } class Car : Vehicle class ConsoleApplication static void Main(string[] args) Vehicle vehicle = new Vehicle(); Car car = new Car(); // is 연산자 if (car is Vehicle) vehicle = car; // 형이 같으면 변환 없이 대입 가능 Console.WriteLine("Car is a Vehicle"); else Console.WriteLine("Car is not a Vehicle");

2. 데이터 형 변환 as 연산자 as 연산자는 괄호 안에 데이터형을 표현하는 캐스트 연산자와 비슷한 역할을 한다.

참조형 변수 car를 Vehicle형으로 변환 2. 데이터 형 변환 as 연산자 캐스트 연산과 비슷 형변환이 가능한 형인지 호환성 조사 후에 형 변환된 값 반환 <예제> class Vehicle { } class Car : Vehicle … Vehicle veh = new Vehicle(); Car car = new Car(); veh = car as Vehicle ; 참조형 변수 car를 Vehicle형으로 변환 형 변환 가능한지 호환성 검사 후에 변환된 값을 넘긴다. 만약 형 변환이 가능치 않으면 null을 반환하고 예외를 발생시키지 않는다.

2. 데이터 형 변환 as 연산자 Vehicle 형 변수 vehicle 선언 using System; class Vehicle { } class Car : Vehicle { } class ConsoleApplication static void Main(string[] args) Vehicle vehicle = new Vehicle(); Car car = new Car(); // 1. as 연산자 사용하여 형 변환 vehicle = car as Vehicle; //Car 형 변수 car를 as 연산자를 사용해서 Vehicle 형으로 변환 if (vehicle != null) // 2. 형 변환 성공 여부 확인 Console.WriteLine("Car is a Vehicle"); else Console.WriteLine("Car is not a Vehicle"); Vehicle 형 변수 vehicle 선언 new 연산자 이용하여 변수명이 vehicle 인 객체를 생성 Vehicle()생성자를 이용하여 변수명이 vehicle 인 객체를 초기화

2. 데이터 형 변환 object 형 변환 모든 참조형은 System.Object 형으로부터 파생되어 나왔다. 따라서 모든 참조형은 System.Object 형으로 형 변환이 가능하다. using System; class Vehicle { } class Car : Vehicle{ } class ConsoleApplication { static void Main(string[] args) Vehicle v = new Vehicle(); Car c = new Car(); // object object o = c; Car b = o as Car; if (b != null) { Console.WriteLine("Vehicle is a Car"); } else { Console.WriteLine("Vehicle is not a Car"); } (11행) Car 형 변수 c를 object형으로 암시적으로 변환함 (12행) object형으로 변환된 변수 o를 Car형으로 명시적으로 변환함. 즉, object 형은 모든 객체의 최상위 기반 클래스 형이므로 형 변환이 가능하다.

2. 데이터 형 변환 박싱과 언박싱 C#에서는 값형과 참조형 사이에서도 형 변환이 가능하다. 값형을 참조형으로 형 변환하는 것을 박싱(Boxing), 반대로 참조형을 값형으로 형 변환하는 것을 언박싱(Unboxing)이라고 한다.

2. 데이터 형 변환 박싱과 언박싱 박싱(boxing) 참조형 -> 값형 : 언박싱(unboxing) 박싱(boxing) 정수형(값형) 변수 x를 참조형 변수 o 에 할당하게 되면 암시적으로 x는 참조형으로 형 변환되게 된다. <예제> int x = 123 ; object o = x ; int y = (int) o ; 언박싱(unboxing) 정수형 변수 y에 참조형 변수를 할당하려고 하면 명시적으로 캐스팅해서 참조형을 정수형으로 변환하게 된다.

2. 데이터 형 변환 박싱과 언박싱 using System; class ConsoleApplication { static void Main(string[] args) int x = 123; object o = x; // Boxing // 값형인 int형으로 정의된 x를 //참조형인 object형으로 암시적으로 변환해서 변수 o에 복사 int y = (int)o; // Unboxing //참조형인 변수 o를 값형인 int형으로 변환해서 복사 Console.WriteLine(x); Console.WriteLine(y); } 형변환이 발생 했지만 데이터는 변하지 않음

요약 참조형 변수란 곧 객체라고 말할 수 있다. 참조형 변수는 메모리의 스택 영역에 저장되지만 실제 저장되는 값은 데이터가 저장된 메모리의 힙 영역의 주 소 값이다.

요약 is 연산자를 통해 형 변환의 가능 여부를 알 수 있다. is 연산자를 통해 true 를 반환하면 형 변환이 가능하고 false 면 형 변환이 가능하지 않다.

요약 기반 클래스와 파생 클래스 관계에 있는 객체 사이에는 형 변환이 가능하다. 기반 클래스와 파생 클래스 관계에 있는 객체 사이에는 형 변환이 가능하다. 파생 클래스형 변수는 기반 클래스형으로 변환할 때 명 시적으로 변환하지 않아도 되면 내부적으로 변환한다. 그렇지만 기반 클래스형 변수를 파생 클래스형으로 변환 할 때는 명시적으로 형 변환을 해줘야 한다.

요약 값형과 참조형 변수 사이에도 형 변환이 가능하다. 값형을 참조형으로 변환하는 것을 박싱이라고 하며 참조 형을 값형으로 변환하는 것을 언박싱이라고 한다.