Java Java vs C# (Property, 속성) - 11부
페이지 정보
본문
안녕하세요. 소심비형입니다. 우리가 흔히 말하는 속성(Property)에 대해서 알아보도록 하겠습니다.
속성이란?
private 한정자로 인해 접근이 제한된 맴버를 읽거나 쓸 수 있도록 하는 방법을 제공하는 특수한 형태의 메소드입니다. 보통 Java는 getter와 setter 메소드를 만들고 네이밍 룰을 적용하도록 되어 있습니다. 룰은 getName, setName과 같은 형태로 속성 메소드를 작성하게 됩니다. C#은 get, set 키워드를 별도로 제공하고 있습니다. 속성에 대해서 좀 더 심도있는 테스트를 위해 몇개의 클래스가 추가되어 있습니다. 이는 C#의 접근 한정자와 속성이 Java와 다른 부분이 많기 때문입니다. 같은 코드를 사용해서 비슷한 효과를 보기 위해 어쩔 수 없는 구조입니다. 먼저 Java에서 Human과 Doctor 클래스를 다른 패키지에 추가합니다.
Java
Human.java
public class Human {
private String name;
private String sex;
private int age;
private String job;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return this.sex;
}
protected void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return this.age;
}
public String getJob() {
return this.job;
}
public void setJob(String job) {
this.job = job;
}
public Human() {
this.age = 1;
this.name = "소심비형";
this.sex = "M";
this.job = "Baby";
}
}
강조 표시되어 있는 21번째 속성은 protected 접근 한정자를 사용하고 있습니다. 이는 처음 태어날 때(37번째 라인의 생성자) 정해져 있는 성별은 의사만이 변경할 수 있기 때문입니다. 사실 33번째 속성도 protected로 해야 할거 같기도 합니다. 내가 선택할수도 있지만, 인사담당자가 채용을 결정할 수 있는 문제니까요. 이런 구조는 관점에 따라서 유연하게 대처할 수 있도록 만들어야 할거 같습니다.
이제 의사를 추가합니다.
Doctor.java
public class Doctor extends Human {
public void 성전환수술(Human human) {
if (human.getSex() == "M") {
human.setSex("F");
} else {
human.setSex("M");
}
}
}
속성에 대한 예제이기 때문에 약간 억지스러울수도 있으나 그냥 봐주시기 바랍니다-_-;
의사는 Human을 상속받고 있습니다. 물론, 같은 패키지에 속해 있기 때문에 의사는 Human의 protected 속성에도 접근이 가능합니다. 이로 인해 의사에게 성전환 수술을 의뢰하면 자신의 성을 변경할 수 있습니다. 아래와 같이 코딩을 추가하고 실제로 성전환이 이루어졌는지 확인해 봅시다.
PropertyTest.java - 진입점
public class PropertyTest {
public static void main(String[] args) {
Human 소심비형 = new Human();
// 변경이 불가능하다.
// 소심비형.setSex("F");
Doctor 의사 = new Doctor();
// 의사는 성전환이 가능하다.
의사.성전환수술(소심비형);
System.out.println(소심비형.getSex());
}
}
아래는 결과입니다. 의사를 통해서 소심비형이 여자가 되었습니다-_-;
C#의 경우에는 get, set 키워드를 통해 접근자라는 특수한 형태의 메소드를 쉽게 만들 수 있습니다.
C#
Human.cs
public class Human
{
public string Name { get; set; } = "소심비형";
public string Sex { get; internal set; } = "M";
public int Age { get; } = 1;
public string Job { get; set; } = "Baby";
}
라인 5에서 사용된 internal은 Java에 없는 접근 한정자입니다. C#은 Java보다 접근 한정자가 2개 더 추가되어 있는데, 그중에 하나가 internal입니다. C#에서의 protected는 상속 받은 자식 클래스에서 부모의 protected에 접근할 때 사용합니다. internal은 같은 라이브러리에서만 접근이 가능한 한정자입니다. 이밖에도 몇가지 특징이 있는데, 이 내용은 접근 한정자 관련 내용에서 좀 더 자세히 다루도록 하겠습니다. 이제 의사 클래스를 추가합니다.
Doctor.cs
public class Doctor : Human
{
public void 성전환수술(Human human)
{
if (human.Sex == "M")
human.Sex = "F";
else
human.Sex = "M";
}
}
결과를 확인하기 위해 콘솔 프로그램의 주 진입점에 아래와 같이 작성합니다.
Program - 진입점
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Human 소심비형 = new Human();
// 변경이 불가능하다.
// 소심비형.Sex = "F";
Doctor 의사 = new Doctor();
// 의사는 성전환이 가능하다.
의사.성전환수술(소심비형);
Console.WriteLine(소심비형.Sex);
Console.ReadLine();
}
}
}
Java와 동일한 결과를 확인할 수 있습니다. 자바의 경우에는 메소드와 동일하기 때문에 이해하는데 크게 어려움이 없습니다. 어쩌면 더 쉽죠. 다만, 강제적인 사항이 아니기 때문에 속성이든 필드든 어떤식으로 구현해도 문제가 되진 않습니다. 컴파일러 입장에서 말이죠. 하지만, 사용자 입장에서는 getter, setter룰에 맞지 않게 작성된 코드는 혼란을 불러올 수도 있습니다. C#은 get, set 키워드를 통해 특수한 형태의 메소드를 제공함으로써 이런 부분을 해소할 수 있었습니다. 비단 네이밍룰 뿐만 아니라 쓰기전용, 읽기전용과 숨겨진 맴버 필드에 접근하는 효율적인 방법을 제공합니다.
다음 시간에...
- 이전글Java vs C# (String, 문자열) - 12부 20.08.27
- 다음글Java vs C# (Method, 메소드) - 10부 20.08.27
댓글목록
등록된 댓글이 없습니다.