접근제한자는 클래스, 함수 가장 앞에 선언되며

C#은 접근제한자가 4개 존재한다

명시하지 않으면 internal이 기본이다

 

  • public : 제약없이 어느곳에서 접근가능
  • private : 선언한 해당 클래스 내에서만 접근가능(클래스에 선언 불가)
  • protected : 선언한 클래스 및 상속받은 자식 클래스에서만 접근가능(클래스에 선언 불가)
  • internal : 해당 프로젝트 내에서만 접근가능(아무것도 명시하지 않으면 internal이 기본)

 

'Programming > C#' 카테고리의 다른 글

[C#] 확장 메서드  (0) 2020.12.23
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18
[C#] is, as 연산자  (0) 2020.12.17

docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/language-specification/namespaces

 

Namespaces - C# language specification

네임스페이스Namespaces 이 문서의 내용 --> C# 프로그램은 네임 스페이스를 사용 하 여 구성 됩니다.C# programs are organized using namespaces. "External" 조직의 시스템 및 프로그램에 대 한 "내부" 조직 시스템

docs.microsoft.com

 

C#에서 namespace는 java의 package와 비슷한 개념이다

 

이름은 자바와 같이 .로 구분하며

 

자바는 패키지 안에 여러 클래스가 존재하면

C#은 네임스페이스 안에 여러 클래스가 존재한다

 

JAVA

package 패키지명;

class 클래스명{

}

C#

namespcae 네임스페이스명
{
    class 클래스명
    {
    }

}

 

 

다른 패키지(네임스페이스)에서 가져와 쓰는 방법도 동일하다

using Study2; //using 다른 네임스페이스 이름

namespace study
{
    class 클래스명
    {
        Study2.Cat cat2 = new Study2.Cat();
    }
}

 

 

네임스페이스 안에는 하위 네임스페이스를 작성할 수 있다

아래 2개의 코드는 같은 코드이다

namespace study1.study2
{
    class A
    {
    }
}



namespace study1
{
    namespace studt2
    {
        class A
        {
        }
    }
}

 

'Programming > C#' 카테고리의 다른 글

[C#] 확장 메서드  (0) 2020.12.23
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18
[C#] is, as 연산자  (0) 2020.12.17

C#은 클래스, 함수 앞에 오는 키워드로 3가지가 있다

abstract, interface, virtual

 

  • abstract(추상) : 클래스, 함수에 사용가능, 정의만 가능 오버라이드 후 구현, 1클래스 1상속
  • interface(구현) : 인터페이스에 사용가능, 정의만 가능 오버라이드 후 구현, 1클래스 다중 상속(구현)
  • virtual(가상) : 함수에만 사용 가능, 정의 후 구현 가능, 오버라이드 후 재구현 가능

앞서 말하자만 

가상메서드는 공통점을 작성할 때 사용한다

그리고 인터페이스나 추상은 그 객체의 고유특징을 작성할 때 사용한다

 

또한, abstract(추상)과 interface(구현)는 반드시  상속 받은 클래스에서

재정의(오버라이드) 해야하는 특징을 가진다

virtual(가상)은 반드시 재정의  하지 않아도 되며, 하지않을 경우 부모클래스의 정의를 따른다

 

아래에서 천천히 설명

 

상속방식은 자바에선

abstract 는 extends

interface는 implments 키워드를 사용하지만

C#은 : 로 동일하다

 

#abstract와 virtual

Animal이라는 추상클래스에서 가상 메서드 speak1과 추상 메서드 speak2를 정의함

가상 메서드는 정의후 구현이 가능하나 추상메서드는 정의만 가능하다

 

이후, Dog라는 클래스에 Animal클래스를 상속시키고

추상 메서드 speak2를 재정의 후 구현하는 모습이다

가상 메서드 speak1은 재정의 하지 않으면 Animal클래스에서 구현된 내용을 따른다

 

#예제1 : abstract와 virtual

namespace Study
{
    abstract class Animal 
    { 
        public virtual void Speak1()//정의 후 구현
        {
            Console.WriteLine("입력해주세요");
        }
        public abstract void Speak2();//정의만 가능
    }
    class Dog : Animal
    {
        public override void Speak2()//abstract는 반드시 재정의 해야하며 재정의 후 구현
        {
            Console.WriteLine("왈왈");
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog();
            dog.Speak1();//입력해주세요, Dog클래스 코드에는 보이지 않지만 자동적으로 구현이 됨
            dog.Speak2();//왈왈, Dog클래스에서 재정의 후 구현

        }
    }
}

 

Dog클래스에는 speak1()메서드가 보이지 않지만 자동적으로 아래의 코드가 구현이 된 상태이다

그렇기 때문에 호출이 가능하다

여기서 base는 부모 클래스다(자바의 super와 같다)

public override void Speak1()
{
     base.Speak1();
}

 

또한 가상메서드 speak1은 재정의 후 구현이 가능하다

 

#예제2 : abstract와 virtual

namespace Study
{
    abstract class Animal 
    { 
        public virtual void Speak1()//정의 후 내용 작성
        {
            Console.WriteLine("입력해주세요");
        }
        public abstract void Speak2();//정의만 가능
    }
    class Dog : Animal
    {
        public override void Speak1()
        {
            Console.WriteLine("멍멍");
        }

        public override void Speak2()//abstract는 반드시 재정의 해야함
        {
            Console.WriteLine("왈왈");
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog();
            dog.Speak1();//멍멍, 가상메서드를 재정의 후 구현
            dog.Speak2();//왈왈, 추상메서드를 재정의 후 구현

        }
    }
}

 

이처럼 가상메서드는 재정의 하지 않아도 부모클래스에서 구현된 코드를 따르기 때문에

공통점을 작성할 때 사용한다

예를 들면

 

동물이라는 부모 클래스에 "걷기", "달리기", "먹기" 같이 개, 고양이, 사슴 등이 가진 공통점은

가상 메서드로 구현후

울음소리와 같이 "멍멍", "야옹" 같은 공통되지 않는 특징은 추상 메서드로 정의만 하고

오버라이드 해서 재정의해서 사용한다

 

그렇기 때문에 가상메서드는 "걷기", "달리기", "먹기" 같은

공통점이기 때문에 상속받은 객체에서 일반적으로는 재정의를 하지 않는다

(만약, 걷기에 추가 기능을 넣을때만 재정의 해서 사용하는 방식

 동물마다 걷기 스태미너 소모를 다르게 설정한다던지)

 

 

 

#interface

interface는 abstract클래스와 다르게 다중 상속이 가능하다

Test1을 보면 interface는 virtual이나 abstract 키워드가 붙어도 적용되지 않는다

virtual키워드를 사용하면 구현 자체가 되지 않으며

abstract키워드를 사용하면 무시되고 일반적인 메서드로 구현이 된다

 

그렇기 때문에 Test1처럼 작성하지 않고 Test2같이 작성하는 것이 일반적이다

    interface Test1
    {
        public virtual void Eat()
        {
            Console.WriteLine("냠냠");
        }
        public abstract void Run();
    
    }
    interface Test2
    {
        public void Angry();
    }

    class Cat : Test1, Test2
    {   
                          //virtual메서드는 인식하지 않음
        public void Run() //abstract메서드를 일반 메서드로 인식
        {
            Console.WriteLine("달린다냥");
        }

        public void Angry()
        {
            Console.WriteLine("화낸다냥");
        }
    }
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.Eat(); //에러, 인터페이스는 virtual메서드를 인식하지 않음
            cat.Run();
            cat.Angry();


        }

 

 

'Programming > C#' 카테고리의 다른 글

[C#] 확장 메서드  (0) 2020.12.23
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] namespace란  (0) 2020.12.18
[C#] is, as 연산자  (0) 2020.12.17

docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/type-testing-and-cast#as-operator

 

형식 테스트 연산자 및 캐스트 식 - C# 참조

식 결과의 형식을 검사하고, 필요한 경우 다른 형식으로 변환하는 데 사용할 수 있는 C# 연산자에 대해 알아봅니다.

docs.microsoft.com

 

# is 연산자 :  데이터 타입이 같으면 true 다르면 false를 반환

int i = 27;

Console.WriteLine(i is int);  // output: True
Console.WriteLine(i is long);  // output: False

 

 

# as 연산자 : 참조 대상이 대입하려는 변수와 데이터형이 같으면 값을 대입, 아니면 null을 반환

as 앞에 오는 list1이 참조대상

IEnumerable<int> numbers = new[] { 10, 20, 30 };
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
    Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]);  // output: 40
}



List<string> list1 = new List<string>();
List<string> list2 = list1 as List<string>; //list1이 List<string>타입인가?
if (list2 != null)
{
}

'Programming > C#' 카테고리의 다른 글

[C#] 확장 메서드  (0) 2020.12.23
[C#] MSSQL 연결 후 SQL 실행  (0) 2020.12.23
[C#] 접근제한자  (0) 2020.12.18
[C#] namespace란  (0) 2020.12.18
[C#] abstract, interface, virtual  (0) 2020.12.18

#ResultMap

스프링 프레임워크에서 XML파일에서 SQL을 처리할때(Mybatis)

테이블의 컬럼명과 자바Bean(VO, DTO)의 필드명이 다를때 매칭 시켜주는 기능

SQL문 최상위에 작성해야 한다

 

 

이러한 문제가 발생하는 원인은 DB에 따라 대소문자 구분방식이 다르기 때문에

컬럼명을 작성할때 _언더바를 쓰는 경우가 있다(postgreSQL)

 

 

# 작성법

	<resultMap id="boardMap" type="com.test.site.Entity.BoardVO">
        <id column="GOODS_NUMBER"  --필수, 변환 대상 이름
            property="goodsNumber" --필수, 변환 할 이름
            jdbcType=""            --옵션, DB컬럼 데이터 타입 명시적 선언
            javaType=""            --옵션, Bean 필드 데이터 타입 명시적 선언
            nullValue=""           --옵션, 해당 컬럼 값이 null일 경우 대신 반환할 값 
        />
	</resultMap>

 

#테이블 컬럼명과 Bean의 필드명이 일치하는 경우

	<select id="selectBoard" resultType="com.test.site.Entity.BoardVO">
		SELECT * FROM 테이블
	</select>

 

 

#테이블 컬럼명과 Bean의 필드명이 일치하지 않는 경우

resultMap의 result 속성은 SELECT 결과의 컬럼명에 매칭된다

	<resultMap id="boardMap" type="com.test.site.Entity.BoardVO">
		<result column="GOODS_NUMBER" property="goodsNumber"/>
		<result column="GOODS_NAME" property="goodsName"/>
		<result column="GOODS_ID" property="goodsId"/>
		<result column="GOODS_PRICE" property="goodsPrice"/>
		<result column="GOODS_COST" property="goodsCost"/>
		<result column="INSERT_DATE" property="insertDate"/>
		<result column="UPDATE_DATE" property="updateDate"/>
		<result column="FILE_NAME" property="fileName"/>
	</resultMap>

	<select id="selectBoard" resultMap="boardMap">
		select * from mst_goods
	</select>

 

SELECT문의 resultType대신 resultMap을 적어주고

resultMap을 작성하면 된다

 

# resultMap의 id가 SELECT문의 resultMap에 작성하는 id이다

# resultMap의 type은 기존 SELECT문의 resultType을 적어주면 된다(int, String, Bean경로)

 

resultMap의 result 속성은 column을 property로 변환한다

아래 코드는 테이블 컬럼명 GOODS_NUMBER를 goodsNumber로 변환한다

	<resultMap id="boardMap" type="com.test.site.Entity.BoardVO">
		<result column="GOODS_NUMBER" property="goodsNumber"/>

 

그리고 변환한 property명을 type에 반환한다

 

'Programming > JAVA' 카테고리의 다른 글

[JAVA] 접근 제한자  (0) 2020.12.18
[JAVA] 빈 문자열, NULL 다루기  (0) 2020.11.19
[JAVA] 문자열 비교  (0) 2020.11.19
[JAVA] 대소문자 변환  (0) 2020.11.19
[SPRING] Spring 구조 및 DTO, VO 개념  (0) 2020.10.07

+ Recent posts