C# 클래스
현실 세계를 모델링하여 사물을 속성과 행위로 나눠 코드로 표현
1 2 3 4 5 6 7 8 9 | class Book{ string title; decimal ISBN13; string Content; string Author; int pageCount; } Book gulliver = new Book(); |
단순히 속성만 있는 클래스를 정의하고 생성하는 코드.
객체 지향 프로그래밍에서는 저런 객체들 간의 행위를 통해 코드를 작성함.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Book{ public string Title; public decimal ISBN13; public string Contents; public string Author; public int PageCount; public void Open(){ Console.WriteLine("Book is opened"); } public void Close(){ Console.WriteLine("Book is closed"); } } |
메서드 추가, 메서드를 사용하는 이유는 코드 중복을 제거할 수 있기 때문. 또한 재사용도 가능.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Console.WriteLine("person 객체 생성 전"); Person person = new Person(); Console.WriteLine("person 객체 생성 후"); } } class Person { string name; public Person() { name = "홍길동"; Console.WriteLine("생성자 호출"); } } } |
//결과
//person 객체 생성 전
//생성자 호출
//person 객체 생성 후
클래스는 객체 인스턴스를 생성할 때(new) 생성자를 호출하는데 그 때 멤버변수 초기화같은 일을 할 수 있음.
* 따로 생성자를 선언하지 않으면 디폴트로 인자없는 생성자를 컴파일러가 생성함
그러나 개발자가 임의로 인자있는 생성자를 생성할 경우 디폴트 생성자를 만들어주지 않음 (주의)
** static 정적 필드와 메서드
클래스에서 new로 할당받은 인스턴스는 각 객체마다 고유하게 메모리를 확보하기 때문에 클래스 전역적으로 값이 유지되지 않는다.
그래서 이런 요구사항을 만족하기 위해 클래스 단위의 필드를 정의 해야함. = static 예약어
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Person person1 = new Person("jeong"); Person person2 = new Person("pro"); Console.WriteLine(Person.CountOfInstance); // 결과 2 } } class Person { static public int CountOfInstance; // static 예약어로 인해 정적 필드로 만듦 string name; public Person(string name) { CountOfInstance++; this.name = name; } static public void OutputCount() // 정적메서드 { Console.WriteLine(CountOfInstance); // 정적메서드에서 정적 필드에 접근 } } } |
Person 클래스에서 static 이라는 키워드만 붙이면 된다.
Person 클래스 내에서 하나만 만들게 되며 클래스단위에서 공유 가능.
* 유념해야할 것은 클래스의 인스턴스로 객체가 생성되기 전에도 접근가능.
* 정적메서드도 마찬가지로 static만 붙이면 되나, 정적메서드에서는 인스턴스멤버를 접근할 수 없음.
( 너무도 당연한게 클래스의 인스턴스가 생성되기전에 static 메서드를 사용 가능하니까 static 메서드에 인스턴스멤버를 사용한다는게 말이 안됨. 없는걸 쓰겠다고? )
Main 메서드 규칙
- 메서드 이름은 반드시 Main
- 정적 메서드여야함 static
- Main 메서드가 정의된 클래스의 이름은 자유 단, 2개 이상의 클래스에서 Main 메서드를 정의하고 있다면 컴파일러가 구분 가능하게 어떤클래스의 Main을 실행할지 클래스를 지정해야함.
- Main메서드의 반환값은 void 또는 int만 가능
- Main 메서드의 매개변수는 없거나 string 배열만 허용
정적 생성자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Person person1 = new Person("jeong"); Console.WriteLine("--------"); Person person2 = new Person("pro"); } } class Person { string name; public Person(string name) { this.name = name; Console.WriteLine("일반생성자"); } static Person() { Console.WriteLine("정적생성자"); } } } |
//결과
//정적생성자
//일반생성자
//--------
//일반생성자
정적 생성자는 최초로 접근할 때 딱 '한번만' 실행됨.
namespace
namespace는 자바의 패키지와 비슷한 역할.
클래스나 변수들의 이름이 겹치는 것을 방지하기위해 생김.
using System;
이게 System 네임스페이스에서 가져온다는 얘기임
그래서 System.Console.WriteLine("~~~"); 이 문장을 System을 빼고 사용가능한 것.
* using문은 반드시 코드파일의 첫부분에 있어야함. 그 어떤 문장도 using보다 먼저오면 안됨.
'C#' 카테고리의 다른 글
C# delegate (콜백, 체인, 범용성) (0) | 2017.09.16 |
---|---|
C# 다형성 (override, overload, implicit, explicit) (0) | 2017.09.15 |
C# 캡슐화, 상속(접근제한자, 프로퍼티, as, is, Object, this, base) (0) | 2017.09.15 |
C# 기초 (변수, 예약어, 연산자, 반복문, 조건문등) (0) | 2017.09.13 |
C# .NET framework 개발 환경 준비 (2) | 2017.09.12 |