본문 바로가기

   
Programming/C#

public, private, static, 인스턴스, 참조변수 소멸

반응형

접근 지정자(제한자)

 - Acces Modifier

 - 클래스 멤버의 보안 제어(캡슐화, 내부 은닉화)

 - public, private, protected, internal, protected internal

 

public

 -  클래스의 멤버를 100% 공개

 - 클래스 내부, 외부(다른 클래스), 파생클래스, 외부 파일 등..

 - 언제든지, 어디서나 접근 가능한 멤버를 만들고자 할때....

 - 메서드중 공개가 필요한건 public 그외의 메소드는 private

 

private

 - public의 정반대

 - 클래스의 멤버를 100% 비공개

 - 클래스 내부외엔 절대 접근 불가능

 - public 에선 사용할 필요가 없고 선언한 클래스 내에서만 사용하기 위해서 만든것이다.

 - 무조건 멤버 변수는 private으로 선언 한다.

 

외부 = 다른 클래스 오직 자기 클래스 안에서만 사용가능한것이 private

 

인스턴스란 실제 메소드 및 클래스 객체안에 선언되는 객체들

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Test

{

       class Access

       {

             public static void Main(string[] args)

             {

                    //Student 클래스의 인스턴스를 생성한다.(객체를 만든다.)

                //Student타입(클래스)의 참조변수를 만든다. -주소값 저장

                    Student s1 = new Student();

                   

                    Console.Write("나이를 입력 : ");

                    int n = int.Parse(Console.ReadLine());

                    s1.SetAge(n);

 

                    s1.name = "김종현";

 

                    int age = s1.GetAge();

                    Console.WriteLine("나이 : {0}", age);

 

                    s1.Hello();

                   

             }

       }

 

       class Student

       {

             //멤버 변수

             public string name;

             //1~100살 이내

             //무조건 감추자

             private int age;

 

             //인터페이스의 역활 (핸드폰 버튼, 모니터 전원 버튼 => public)

             public void SetAge(int n)

             {

                    if (n >= 1 && n <= 100)

                           this.age = n;

                    else

                           Console.WriteLine("나이를 잘못 입력 하였습니다.");

             }

 

             public int GetAge()

             {

                    return this.age;

             }

 

             //멤버 메서드

             public void Hello()

             {

                    //this 객체 연산자 or 객체 지정 연산자

                    Console.WriteLine("안녕하세요 저는 {0} 입니다. 나이는 {1}세 입니다.\n 태어난 년도는 {2}연도 입니다.", this.name, this.age, this.GetYear());

             }

 

             //객체 내부에서만 사용하는 전용 메서드

             private int GetYear()

             {

                    return DateTime.Now.Year - this.age;

             }

       }

}

 




Static 정적변수, 공용 변수

동시에 같이 사용할 변수

목적 : 공간 낭비 최소화

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Test

{

       class Static

       {

             public static void Main(string[] args)

             {

                    //static 키워드 0, X

                    //객체변수 vs 정적변수

                    //객체메서드 정적메서드

                    //학생 3 - 당산중학교

                    Student s1 = new Student();

                    s1.name = "가가가";

                    //s1.schoolName = "당산중학교";

 

                    //클래스는 내부적으로 스태틱을 검색한다.(내부적으로 그렇게 만들어 놓은것)

                    Student.schoolName = "당산중학교";

 

                    Student s2 = new Student();

                    s2.name = "나나나";

                    //s2.schoolName = "당산중학교";

                   

 

                    Student s3 = new Student();

                    s3.name = "다다다";

                    //s3.schoolName = "당산중학교";

 

                    s1.Hello();

                    s2.Hello();

                    s3.Hello();

             }

 

             class Student

             {

                    public string name;

                    //정적변수(공용변수)

                    //물리적인 구조상 객체에선 스태틱을 접근 할수 없다.

                   

                    public static string schoolName;

                    public int age;

 

                    public void Hello()

                    {

                           Console.WriteLine("{0}에 다니는 {1}입니다.", Student.schoolName, this.name);

                    }

             }

       }

}

 

 


static 메인 메서드가 실행되기 전에 메모리에 올라온다.

객체를 만들때마다 생성되는것 ex) public int

객체를 만들때마다 생기지 않고 미리 메모리에 잡혀있는것  ex) static int

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Test

{

       class Static_02

       {

             public static void Main(string[] args)

             {

                    Test t1 = new Test();

 

                    t1.a = 100;

                    Test.b = 200;

 

                    t1.M1();

                    Test.M2();

             }

 

             class Test

             {

                    public int a;

                    public static int b;

 

                    //객체 메서드

                    //자기 자신이 갖는 변수 , 자기 자신이 갖는 메서드, 정적 변수, 정적 메서드

                    public void M1()

                    {

                           Console.WriteLine("객체 메서드입니다.");

                           Console.WriteLine(" a : {0}, b : {1}", this.a, Test.b);

                    }

 

                    //정적 메서드

                    //정적 메서드 에서는 객체 멤버에 접근이 불가능 하다.

                    //this 사용불가x 정적으로 선언된것은 얼마든지 사용가능

                    //정적 메서드 단점 : 공간 낭비가 심하다, 관리하기 위험하다.

                    public static void M2()

                    {

                           Console.WriteLine("정적 메서드입니다.");

                           Console.WriteLine(" a : {0}, b : {1}", a, Test.b);

                    }

             }

       }

}

 



인스턴스 소멸, 참조변수 소멸
객체에서 변수가 생성되면 null값을 가진다. null값에서 주소값을 저장 해놓는다. 그 상태에서 다시 null을 삼입시 주소값이 사라지기 때문에 참조하고있던 값은 가비지가 되며 가비지 컬렉터가 삭제하게 된다.
하지만 참조되어 있는 변수에 다른 참조 변수가 복사가 되있다면 가비지가 되지 않으니 주의해야 한다. 

반응형