1. 레퍼런스 this
- 자기 자신의 인스턴스 주소가 자동으로 저장되는 참조 변수(레퍼런스 변수)
- 메서드(또는 생성자) 내에서 로컬변수와 멤버 변수(인스턴스 변수)의 이름이 같을 경우
- 멤버변수를 가리키기 위해 사용하는 키워드
- 동일한 클래스 내의 this 키워드를 사용하면 인스턴스마다 다른 주소를 가리키게 됨
<기본 사용법 >
this.멤버변수명
ex)
using System;
namespace Test
{
public class Program
{
static void Main(string[] args)
{
// Student 인스턴스 생성, 이름 : 홍길동, 나이 : 20 출력
Student s = new Student();
s.name = "홍길동";
s.setName("홍길동"); // this.name = name 에서 this 는 Student 인스턴스(s)
Console.WriteLine("이름 : " + s.getName());
Console.WriteLine("---------------------");
Student s2 = new Student();
s2.name = "이순신";
s2.setName("이순신"); // this.name = name 에서 this 는 Student 인스턴스(s2)
Console.WriteLine("이름 : " + s2.getName());
}
}
class Student
{
public String name;
public int age;
public String getName()
{
return name;
}
public void setName(String name)
{
// 메서드 내에서 멤버변수(name)와 로컬변수(name)의 이름이 같을 경우
// 변수명 name 을 지정하면 로컬변수를 가리키게 된다
// 따라서, name = name; 코드는 로컬변수 값을 로컬변수 자신에게 대입하는 코드가 되므로
// 아무런 효과가 없는 코드가 된다
// name = name; // 로컬변수 값을 로컬변수에 대입하는 코드
// 로컬변수(name) 값을 멤버변수(name)에 저장하려면
// 멤버변수 name 앞에 레퍼런스 this 를 사용해야한다 (this.name 형태로 멤버변수 지정)
this.name = name;
}
public int getAge()
{
// 멤버변수만 있고 로컬변수가 없어서 이름이 중복되지 않는 경우에는
// 멤버변수 앞에 this 를 생략할 수도 있고, 붙일 수도 있다
return this.age; // return age; 와 동일한 코드
}
public void setAge(int age)
{
// 멤버변수 age 와 로컬변수 age 가 이름이 동일하므로
// 멤버변수 age 앞에 레퍼런스 this 가 필수
this.age = age;
}
}
}
<출력 결과>
2. 생성자 this()
- 자기 자신의 또 다른 생성자를 호출하는 키워드
- 생성자 오버로딩 시 코드의 중복이 발생하는데, 코드 중복 제거를 위해 하나의 생성자에서 모든 작업을 처리하고 나머지 생성자는 해당 생성자를 호출하여 값만 전달하면 코드 중복이 제거될 수 있다
< 기본 문법 >
: this()를 사용
ex)
using System;
namespace Test
{
public class Program
{
static void Main(string[] args)
{
Student2 s1 = new Student2();
Console.WriteLine("이름 : " + s1.name + ", 나이 : " + s1.age);
Student2 s2 = new Student2("이순신");
Console.WriteLine("이름 : " + s2.name + ", 나이 : " + s2.age);
Student2 s3 = new Student2("아무개", 30);
Console.WriteLine("이름 : " + s3.name + ", 나이 : " + s3.age);
}
}
class Student2
{
public String name;
public int age;
// Student2() 생성자 정의 - 이름(name)은 홍길동, 나이(age)는 0으로 초기화
public Student2()
{
// Student2(String, int) 생성자를 호출하여 대신 초기화 작업 수행
this.name = "홍길동";
this.age = 0;
Console.WriteLine("Student2() 생성자 호출됨!");
}
// Student2(String) 생성자 정의 - 이름(name) 전달받아 초기화, 나이(age)는 0으로 초기화
public Student2(String name): this()
{
this.name = name;
Console.WriteLine("Student2(String) 생성자 호출됨!");
}
// Student2(String, int) 생성자 정의 - 이름(name), 나이(age) 전달받아 초기화
public Student2(String name, int age): this()
{
this.name = name;
this.age = age;
Console.WriteLine("Student2(String, int) 생성자 호출됨!");
}
}
}
<출력 결과>
반응형
'C#' 카테고리의 다른 글
[C#] 변수 뒤에 물음표(?)는 Nullable Type (0) | 2022.01.27 |
---|---|
C#기초 - 접근 제한자 (public vs private),(Getter,Setter 사용법) (0) | 2021.05.27 |
C# 메서드 사용(3) - 메서드 오버로딩(Method Overloading) (0) | 2021.02.21 |
C# 메서드 사용(2) - 매개변수전달:선언 기본형 변수, 참조형 변수 (0) | 2021.02.17 |
C# 메서드 사용(1) - 인스턴스 변수, 로컬변수 선언 (0) | 2021.01.13 |
댓글