객체지향프로그래밍이란?
상태와 행위로 이루어진 객체라는 단위로 파악하고자 하는 프로그래밍 패러다임이다.
객체의 구성요소
속성(멤버변수) + 기능/행위(메소드)
클래스
속성과 행위를 변수와 메소드로 정의한 것을 클래스라고 한다.
인스턴스(객체)
클래스로 정의된 타입을 new 연산자로 메모리에 할당한 것을 인스턴스라고 한다.
추상화
데이터를 속성으로, 코드를 메소드로 정의한 것을 추상화라고 한다.
생성자
객체가 생성될때 자동으로 호출되는 메소드
종료자
객체가 제거되는 시점에 실행되는 메소드
class Album
{
public album(){/*생성자*/
Console.WriteLine("생성자");
}
~album(){
Console.WriteLine("종료자");
}
}
인스턴스 멤버
new연산자를 거쳐 메모리에 할당된 객체에 속한 멤버
개별 인스턴스 내에서만 유효
스택에는 인스턴스 필드, 힙에는 값이 할당
정적 멤버
모든 객체가 공유하는 멤버, 전역적으로 적용될 필드, 메소드, 생성자
static으로 선언
인스턴스를 만들지 않고(new연산자 사용안하고도) 바로 접근 가능
인스턴스 필드 예시
class Test{
static void Main(string[] args){
Album a1 = new Album();
Album a2 = new Album();
Album a3 = new Album();
}
}
class Album{
public int numb;
public string singer;
public string album_name;
public Album(){
numb++;
Console.WriteLine(numb);
}
}
정적필드 예시
class Test{
static void Main(string[] args){
Album a1 = new Album();
Album a2 = new Album();
Album a3 = new Album();
}
}
class Album{
static public int numb; //정적필드
public string singer;
public string album_name;
public Album(){
numb++;
Console.WriteLine(numb);
}
}
정적필드는 인스턴스를 만들지 않고도 접근 가능 ([클래스명].[정적필드])
class Test{
static void Main(string[] args){
Album a1 = new Album();
Album a2 = new Album();
Album a3 = new Album();
Console.WriteLine(Album.numb);
}
}
class Album{
static public int numb; //정적필드
public string singer;
public string album_name;
public Album(){
numb++;
}
}
싱글톤 패턴
인스턴스가 최초 한번만 메모리에 할당되어 전역적으로 접근 가능하도록 하는 디자인패턴
메모리 낭비 방지
싱글톤 클래스 예제 (생성자가 단 한번만 실행되기 때문에 numb의 값이 한번만 증가함)
class Test{
static void Main(string[] args){
Album.album.Count();
}
}
class Album{
static public Album album = new Album();
private int numb;
private string singer;
private string album_name;
private Album(){
numb++;
}
public void Count(){
Console.WriteLine(numb);
}
}
정적메소드
static 예약어가 붙은 메소드
정적메소드 안에서는 인스턴스 멤버에 접근이 불가능하다.(new로 할당된 객체가 없기 때문)
class Album{
private int numb;
private string singer;
private string album_name;
private Album(){
numb++;
}
static public void Count(){
Console.WriteLine(numb);
//에러 : 정적메소드에서 인스턴스 멤버에 접근 불가
}
}
class Album{
static private int numb;
private string singer;
private string album_name;
private Album(){
numb++;
}
static public void Count(){
Console.WriteLine(numb);
//정적메소드에서 정적필드 접근 가능
}
}
Console.WriteLine
Console 클래스에 정의된 WriteLine 정적 메소드
정적 생성자 type initializer
static 예약어를 붙임
클래스에 단 한개만 존재할 수 있음
정적 데이터를 초기화하거나 한 번만 수행하는 작업 시 사용
처음 인스턴스가 생성될 때 OR 정적 멤버가 참조되기 전에 자동으로 호출
정적필드를 참조할 때 정적 생성자 호출
class Test{
static void Main(string[] args){
int numb = Album.numb;
}
}
class Album{
static public int numb;
private string singer;
private string album_name;
public Album(){
numb++;
Console.WriteLine("생성자");
}
static Album(){
Console.WriteLine("정적생성자");
}
}
인스턴스가 생성될 때 정적생성자 호출
정적생성자는 처음 한번만 호출된다.
class Test{
static void Main(string[] args){
Album album1 = new Album();
Album album2 = new Album();
Album album3 = new Album();
int numb = Album.numb;
}
}
class Album{
static public int numb;
private string singer;
private string album_name;
public Album(){
numb++;
Console.WriteLine("생성자");
}
static Album(){
Console.WriteLine("정적생성자");
}
}
네임스페이스
이름이 똑같은 클래스를 사용할 때 사용
클래스의 소속을 구분할 때 사용
using 예약어를 사용하여 네임스페이스를 생략할 수 있음
단 using 예약어는 파일 첫 부분에 있어야함
using 사용 안할때
using System;
namespace Example
{
class Program
{
static void Main(string [] args)
{
Product.Album album1 = new Product.Album();
}
}
}
namespace Product{
class Album
{
}
}
using 사용할 때
using System;
using Product;
namespace Example
{
class Program
{
static void Main(string [] args)
{
Album album1 = new Album();
}
}
}
namespace Product{
class Album
{
}
}
using System
Console 클래스가 System이라는 namespace 내부에 정의됨
Consel.WriteLine = System.Console.WriteLine
네임스페이스 : System
클래스 : Console
정적메소드 : WriteLine
'프로그래밍 > C#' 카테고리의 다른 글
as, is 연산자 (0) | 2020.03.20 |
---|---|
객체지향 - 3 (0) | 2020.03.20 |
객체지향 -2 (0) | 2020.03.20 |
Main 함수를 알아보자 (0) | 2020.03.20 |
break, continue, goto (0) | 2020.03.19 |
WRITTEN BY