NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    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());
    	}
    }

     

     

    아래는 결과입니다. 의사를 통해서 소심비형이 여자가 되었습니다-_-;

    5YiMECY.png

     

    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 키워드를 통해 특수한 형태의 메소드를 제공함으로써 이런 부분을 해소할 수 있었습니다. 비단 네이밍룰 뿐만 아니라 쓰기전용, 읽기전용과 숨겨진 맴버 필드에 접근하는 효율적인 방법을 제공합니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.