너무 졸린데..
using Sy;k;kkmkmlkjk
kjoko
olkl
using System;
using static System.Console; >정적멤버를 여럿가진다
Write()메소드
Writeline()메소드 (6장)
정적멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다고 선언 .(7장)
global using도 가능
네임스페이스
비슷한 클래스 구조체 인터페이스 대리자 열거형식 등을 묶음
System.IO 네임스페이스는 파일입출력
System.Pringting 출력
.NET클래스 라이브러리에 1만개가 훨씬넘는 클래스가 있어도 사용가능- 용도별/분야별 정리
네임플레이스Hello 내에 MainApp클래스 를 다른 네임플레이스사용시
using Hello 하거나 using Hello.Mainapp
한개의 소스파일.cs 는 여러개 namespace 가질 수 있다. but 보통 하나만
C# 10 에서는 파일범위 네임스페이스 namespace{}말고 ; 붙이면됨
클래스:C#프로그램 기본단위 - 데이터+ 데이터를처리하는기능(메소드) (7장)
메인메소드
메소드- 객체지향프로그래밍세계의 함수 /모든것이 객체이고 함수는 객체의 일부
타 언어에서 서브루틴이나 함수로 부름
7장
객체지향OOP
객체가 가진 2가지
속성- 데이터
기능-메소드
객체(자동차-실체-주차장-메모리공간차지)를 만들기위한 청사진- 클래스(설계도-실체X)
string클래스 a객체="123";
a객체 = string의 실체=인스턴스
클래스선언
class 클래스이름 = 청사진
{
데이터=변수=필드=속성
메소드
프로퍼티
이벤트
}
다 합쳐서 {멤버}
instance만들기=실체 객체
클래스는 복합 데이터형식이다
복합 데이터형식은 참조형식이다.
Cat kitty;에서 kitty는 null이다.kitty 자체에 메모리 할당되지않고, 참조로서 객체가 있는 곳을 가리킨다.
그래서 new연산자와 생성자가 필요 - 힙에 객체를 생성하고 - kitty는 생성자가 힙!에 생성한 객체
Cat kitty=new연산자 Cat()생성자=특별한메소드=클래스와 동일한이름=객체생성역할;
Console.WriteLine("{0} : {1}", kitty.Name,kitty.Color);
new연산자와 생성자는 모든 데이터 형식에 사용가능
int float string 도 생성자 가짐 int a = new int(); 가능
string b = new string( new char[]{'한','글'}); 근데 굳이쓸일없다
class Cat 청사진
{데이터 변수 필드 속성
메소드}
class Mainapp
{메인메소드
인스턴스=객체생성
뉴연산자+생성자 =힙!에 객체생성
Cat클래스 kitty객체 = new연산자 Cat()생성자; 힙에 키티생성
kitty.Color="흰색";
kitty.Name="키티";
Console.WriteLine($"{kitty.Name}:{kitty.Color}");
생성자=클래스와 이름이 같다/ 반환형식이 없다.
명시적구현안해도 컴파일러에서 생성자만들어줌=기본 생성자
그럼 왜 구현 객체의필드를 원하는 값으로 초기화 하고 싶을때
매개변수를 입력받아 원하는 값으로 필드를 초기화 할 수 있는 최적의 장소
Class Cat클래스 청사진 {
public한정자 Cat()생성자()
{ Name="";
Color=""; }
public한정자 Cat(string_Name,string_Colore)생성자()
{ Name=_Name;
Color=_Color; }
}
생성자 만들때 Cat();Cat(인수,인수);
생성자를 하나라도 직접적이하면 C#컴파일러는 매개변수 없는 기본 생성자를 제공하지 않습니다.!
종료자
생성자이름=클래스이름
종료자이름=~클래스이름 / 매개변수X /한정자 사용X /오버로딩X/직접호출X/
CLR의 가비지 컬렉터가 객체 소멸시점판단해서 종료자 호출/ 가급적 사용하지 않는것이 좋은이유
CLR의 가비지 컬렉터가 언제 동작할 지 예측 불가
중요한 자원을 종료자에서 해제하도록 놔두면 얼마가지않아 자원이 금세 부족해질수도
명시적 구현시 가비지 컬렉터는 클래스 족보를 타고 올라가 객체로 부터 상속받은 Finalize()메소드를 호출- 성능저하초래
> CLR가비지 컬렉터는 우리보다 훨씬 더 똑똑하게 객체 소멸 처리 따라서 생성은 생성자에 뒤처리는 가비지컬렉터에 맡기자
class Cat청사진{
public한정자 Cat() 생성자
{ Name = ""; Color = ""; }
public한정자 Cat(string_name, string_color) 생성자
{ Name = _Name; Color = _Color; }
}
~Cat() 종료자
{Console.WriteLine($"{Name} : 잘가");}
public string Name; 필드=속성=데이터=변수
public string Color; 필드=속성=데이터=변수
public void Meow() 메소드
{
Console.WriteLine($"{Name} " 야옹"); }
}
class MainApp {
메인메소드{
클래스 객체 = 뉴연산자 생성자
객체.메소드 }
}
결과가 다를 수도 있다. 객체 소멸을 담당하는 가비지 컬렉터가 언제 동작할지를 모르기때문이다. 프로그램종료전에 반드시 가비지가 쓰레기를 수집하는 보장/ 어떤 객체를 순서로 소멸시킬지에대한 보장도 없으므로 / 네로: 잘가 키티: 잘가는 언제 나올지 모름
정적필드와 메소드
6.1절에서 static 한정자 - 정적이라는 뜻/ 메소드나 필드가 클래스의 인스턴스가 아닌, 클래스 자체에 소속되도록 지정하는 한정자
한 프로그램안에서 클래스 단하나만 존재 ! 인스턴스 여러개 존재! 어떤 필드속성변수데이터가 클래스에 소속된다는 것은 곧 그 필드가 프로그램 전체에서 유일하게 존재.
staticX 인스턴스에소속
staticO 클래스에소속 _ 정적필드 > 이득? 프로그램 전체에 하나밖에 없는 필드이므로 프로그램 전체에 걸쳐 공유해야하면 사용
class Myclass{
public한정자 static정적한정자 int데이터타입 a ;
public한정자 static정적한정자 int데이터타입 b ; }
메인메소드
{MyClass.a=1; 바로만들어버림 MyClass.b=2;}
객체.속성이아닌 클래스. 속성
여러 클래스에서
Global이라는 이름의 가진 클래스의
정적필드에 접근!
class Global{ public static int Count = 0 ;}
class classA
pi
정적 필드 : 인스턴스 아닌 클래스 자체에 소속
정적 메소드 : 인스턴스 아닌 클래스 자체 소속_
따라서 클래스의 인스턴스를 생성하지 않아도 호출 가능 = 내부 데이터를 이용할 일이 없는 경우
비정적메소드 = 인스턴스메소드(인스턴스생성해야 호출가능) = 객체 내부 데이터를 이용해야하는 경우
객체 복사하기: 얕은 복사와 깊은 복사
'프로그래밍 언어 > C#' 카테고리의 다른 글
| Visual Studio 단축키 정리 (0) | 2024.11.14 |
|---|