본문 바로가기

IT/C#

사전 과제 C#



1.  실행파일이 만들어지는 전통적인 컴파일러 방식에 비해 닷넷 프레임워크 환경이 제공하는 장점을 설명하시오.

닷넷의 장점

1. 닷넷의 가장 큰 장점은 플랫폼에 독립적인 응용 프로그램을 만들 수 있다는 것이다.

   플랫폼 독립성은 중간 코드와 JIT 컴파일러에 의해 구현된다. 닷넷이 필요해진 이유이기도 하다.

   소프트웨어를 딱 한 번만 작성해서 수정 없이 어디에서나 실행된다는 것은 정말 큰 매력이다.

 

2. 언어 상호 운용이 가능하다. CLS를 만족하고 관리 코드를 생성해 낼 수 있다면 어떤 언어로도 닷넷 응용 프로그램을 개발할 수 있다. 오로지 자바 언어만 인정하는 자바와는 비교되는 부분이다. 언어 상호 운용성은 언어 독립성보다는 한단계 더 상위의 개념으로서 이기종의 언어끼리 교차 호출, 교차 상속, 교차 디버깅까지도 가능하다.

 

3. 닷넷은 플랫폼 자체가 객체 지향적이며 닷넷 언어들도 모두 완전한 객체 지향 언어이다. C 수준의 API 함수로만 구동되는 윈도우즈와 비교되는 부분이다. 객체 지향은 절차식에 비해 직관적이고 개발 속도가 빨라 생산성이 높고 배우기도 훨씬 더 쉽다.

 

4. 응용 프로그램을 배포하기 쉽다. 어셈블리가 자신에 대한 정보인 메타 데이터를 내장하고 있으므로 단순히 복사하기만 하면 설치 완료된다. 레지스트리에 의존하는 COM과는 달리 시스템에 부하를 주지 않으며 DLL처럼 덮어쓰기에 의해 이전 프로그램이 영향을 받는 경우도 없다. 전용 어셈블리는 자기 디렉터리에 설치되므로 충돌 문제가 아예 없고 공유 어셈블리는 암호화와 엄격한 이름(strong name)에 의해 충돌 방지된다.

 

5. 어셈블리가 어떤 동작을 하는지에 대한 정보가 어셈블리 자체에 작성되어 있어 보안 적용이 쉽고 완벽하다. 닷넷 런타임은 어셈블리가 무엇을 하는지 사전에 조사할 수 있어 부적절한 코드의 실행을 원천적으로 방지할 수 있다. 윈도우즈는 로긴한 사용자에 따라 보안이 적용되는 역할 기반인데 비해 실제 어떤 동작을 하는가에 따라 보안을 적용하는 코드 기반 보안을 지원한다.


6.  프로그래밍 환경이 아주 쾌적하다. CLR은 가비지 컬렉션 기능을 제공하며 할당한 객체를 해제하지 않아도 자동으로 해제한다. C++은 할당 후 반드시 직접 해제해야 하는데 이런 문제로 인해 여러 가지 부작용이 나타나고 메모리 누수로 인해 시스템에도 악영향을 미쳤다. 닷넷에서는 이런 문제가 없어 프로그래밍하기 편리하다. 필요한 만큼 생성해서 쓰고 다 쓴 후 그냥 내 버려 두면 된다. 또한 비주얼 스튜디오 닷넷 같은 막강한 컴파일러의 지원을 받을 수 있다.


7.  닷넷의 활용 범위는 광범위하다. 일반적인 응용 프로그램뿐만 아니라 데이터 베이스 접속도 할 수 있으며 웹 응용 프로그램 개발도 지원한다. 분산 환경의 서버, 클라이언트도 작성할 수 있고 모바일 응용 프로그램까지도 만들 수 있어 필요한 거의 대부분의 응용 프로그램 제작이 가능하다. 닷넷 3.5의 실버라이트로는 플래시같은 예쁜 프로그램도 만들 수 있다. 한마디로 다재 다능하여 닷넷으로 못 만들 프로그램이 거의 없다.


 8.  방대한 양의 클래스 라이브러리(BCL)가 제공된다. BCL에는 윈폼, 웹폼, ADO, 리모팅 등의 기능을 제공하는 클래스들이 체계적으로 잘 정리되어 있다. 뿐만 아니라 XML, 정규식, 이미지 출력, 네트워킹 등 웬만한 기능이 다 포함되어 있어 공짜로 쓸 수 있다. 게다가 BCL은 개별 언어가 아닌 닷넷 플랫폼에 의해 제공되는 것이므로 모든 닷넷 지원 언어들이 이 라이브러리의 서비스를 받을 수 있다. 닷넷 프레임워크는 닷넷 언어들이 공유하는 거대 규모의 라이브러리이다.



출저: http://beansberries.tistory.com/entry/%EB%8B%B7%EB%84%B7net-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%9E%A5%EB%8B%A8%EC%A0%90



2. 기본형과 참조형의 다른 점을 설명하시오.

기본형은 boolean, char, byte, short, int, long, float, double와 같이 계산을 할 수 있는 타입이며,
참조형은 기본형을 제외한 나머지 타입을 의미합니다. String, StringBuffer, List 등등 개인이 만든 클래스도 참조형 타입


기본형
Primitive type
논리형boolean
1btye
   
문자형 char
2byte
  
정수형byte
1byte
short
2byte
int
4byte
long
8byte
실수형  float
4byte
double
8byte
참조형 
Reference type

기본형을 제외한 나머지 타입
4byte



Value Type : 메모리에 값이 직접 저장되는 타입이다. 

Reference Type : 메모리에 데이터가 위치한 주소(참조)를 저장하는 타입이다.


질문
값타입
참조타입
메모리위치는?
스택(Stack)에 활당
관리화 힙(Managed Heap)에 활당
메모리에 뭐가 저장될까?
데이터
데이터가 위치한 메모리 주소
상속이 가능한가?
No
Yes
매개변수의 전달은?
Call by Value
Call by Reference
언제 메모리에서 사라지는가?
정의한 범위 밖에서
가비지 컬렉터에 걸릴때
어떤 데이터형이 있을까?
기본데이터 타입, 
구조체, 열거형
클래스, 배열, 델리게이트, 
인터페이스



출저: http://www.taeyo.net/lecture/CSharp/dukjin05.asp


출처: http://manducku.tistory.com/37 [Manducku`s Code]


출처: http://sexy.pe.kr/tc/236


3. 반복문에서 활용할 수 있는 3가지 문법을 나열하고 특징을 설명하시오.

for

for (int i = 0; i < 10; i++)

{

   Console.WriteLine("Loop {0}", i);

}  



C# for 문은 루프 안에 있는 문장들을 반복적으로 실행할 때 사용한다. for 루프는 일반적으로 카운터 변수를 이용해 일정 범위 동안 for 루프 안의 블럭을 실행한다.

다음 예제는 0부터 9까지 총 10번 콘솔 출력을 반복하는 코드이다


foreach

string[] array = new string[] { "AB", "CD", "EF" };

foreach (string s in array)

{

   Console.WriteLine(s);

}


C# foreach 문은 배열이나 컬렉션에 주로 사용하는데, 컬렉션의 각 요소를 하나씩 꺼내와서 foreach 루프 내의 블럭을 실행할 때 사용된다. 다음 예제는 문자열 배열을 foreach를 사용하여 각 문자열 요소를 하나씩 출력하는 코드이다. 



for vs. foreach 

C# foreach는 for,while 등 다른 루프 문장보다 내부적으로 보다 최적화있는데, 따라서 가능하면 foreach 를 사용할 것을 권장한다. 특히 2차배열, 3차배열 등의 다중 배열을 처리할 경우, for루프는 배열 차수만큼 여러번 루프를 돌려야 하지만, foreach는 아래와 같이 단순히 한 루프 문장으로 이를 처리할 수 있어 편리하다. 

private void for_foreach() {     

// 3차배열 선언     

string[,,] arr = new string[,,] {              

{ {"1", "2"}, {"11","22"} },              

{ {"3", "4"}, {"33", "44"} }     

};     

//for 루프 : 3번 루프를 만들어 돌림     

for (int i = 0; i < arr.GetLength(0); i++)     {

for (int j = 0; j < arr.GetLength(1); j++)         {

for (int k = 0; k < arr.GetLength(2); k++)             {

Debug.WriteLine(arr[i, j, k]);             

}         

}     

}     

//foreach 루프 : 한번에 3차배열 모두 처리     

foreach (var s in arr)     {         

Debug.WriteLine(s);     

 




while

 int i=1;

while (i <= 10)

{

   Console.WriteLine(i);

   i++;

}

C# while 문은 while 조건식이 참인 동안 계속 while 블럭을 실행할 때 사용한다. 다음 예제는 while문을 사용하여 1부터 10까지 번호를 콘솔에 출력하는 코드이다. i가 11이 되면 while 조건식이 false가 되어 while 루프를 빠져나오게 된다. 



do-while

 public class TestDoWhile 

    {

        public static void Main () 

        {

            int x = 0;

            do 

            {

                Console.WriteLine(x);

                x++;

            } while (x < 5);

        }

    }

do-while 루프는 while 문과 달리 조건식이 계산되기 전에 한 번 실행됩니다.

do-while 블록 내의 모든 위치에서 break 문을 사용하여 루프를 벗어날 수 있습니다. continue 문을 사용하여 while 식 계산 문으로 직접 보낼 수 있습니다. while 식이 true이면 루프의 첫 번째 문에서 실행이 계속됩니다. 식이 false이면 do-while 루프 다음의 첫 번째 문에서 실행이 계속됩니다.

do-while 루프는 goto, return 또는 throw 문을 사용하여 종료할 수도 있습니다.


4. 클래스와 객체를 비유를 들어 설명하시오.

클래스: 아이스크림(회사, 유형, 가격, 맛, 유통경로...)
객체: 돼지바(롯데, 바, 1000, 초코딸기, 마트)
       월드콘(해태, 콘, 15000, 딸기, 편의점)

5. C#에서 사용할 수 있는 접근한정자를 나열하고 설명하시오.


public 


접근 제한자

설명 

private

클래스 내부에서만 접근이 가능합니다.

Public 모든 접근이 가능합니다.

internal

같은 어셈블리에서만 public으로 접근이 가능합니다. 

protected

클래스 외부에서 접근할 수 없으나 파생 클래스에서는 접근이 가능합니다.

protected internal 

같은 어셈블리에서만 protected으로 접근이 가능합니다. 


public

    class PointTest
    {
        public int x; 
        public int y;
    }

    class MainClass4
    {
        static void Main() 
        {
            PointTest p = new PointTest();
            // Direct access to public members:
            p.x = 10;
            p.y = 15;
            Console.WriteLine("x = {0}, y = {1}", p.x, p.y); 
        }
    }
    // Output: x = 10, y = 15



Private

class Employee2 { private string name = "FirstName, LastName"; private double salary = 100.0; public string GetName() { return name; } public double Salary { get { return salary; } } } class PrivateTest { static void Main() { Employee2 e = new Employee2(); // The data members are inaccessible (private), so // they can't be accessed like this: // string n = e.name; // double s = e.salary; // 'name' is indirectly accessed via method: string n = e.GetName(); // 'salary' is indirectly accessed via property double s = e.Salary; } }


protected

    class A
    {
        protected int x = 123;
    }

    class B : A
    {
        static void Main()
        {
            A a = new A();
            B b = new B();

            // Error CS1540, because x can only be accessed by
            // classes derived from A.
            // a.x = 10; 

            // OK, because this class derives from A.
            b.x = 10;
        }
    }



intenrnal

// Assembly2.cs  
// Compile with: /target:library  
public class BaseClass   
{  
   internal static int intM = 0;  
}  

// Assembly2_a.cs  
// Compile with: /reference:Assembly1.dll  
public class TestAccess   
{  
   static void Main()   
   {  
      BaseClass myBase = new BaseClass();   // Ok.  
      BaseClass.intM = 444;    // CS0117  
   }  
}  


6. 생성자를 사용하는 목적에 대해서 설명하시오.

In My Ponit)
클래스로 만든 틀을 이용하려면 메모리에 올려야 한다. 생성자는 객체를 초기화 하는 과정이라고 말할 수 있다. new () 이런 양식으로 만들게 되는데 클레스를 초기화 하여 메모리에 올리게 된다. 
특징으로는 생성자는 클래스와 이름이 같아야 하며 반환값이 없어야 한다. 왜냐하면 클레스가 반환하는 값이 있다면 원래 초기화 하려는 목적에 위배되며 내가 선언한 값이 아니라 다른 값이 나온다면 이상해질 것(이거 명확히 했으면...) 클래스는 어떤 기능을 목적으로 만들게 되는데, 파라미터가 다른 경우 여러 생성자를 만들 수 있다. 클래스를 만들 경우 파라미터를 받지 않는 기본 생성자가 만들어지게 된다. 그러나 만약 파라미터를 받는 생성자를 만들게 되면 기본 생성자는 만들어 지지 않는다고 한다. (왠지 모르겟다.) 그렇게 될경우 기본 파라미터를 호출 할 경우 에러가 나게 되는데 이러한 경우 찾기 어려우니 주의하라고 한다.(나는 아직 경험해보지 않음)




생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다. 
[참고]인스턴스 초기화란, 인스턴스변수들을 초기화하는 것을 뜻한다. 

생성자 역시 매서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴값이 없다는 점이 다르다. 그렇다고 해서 생성자 앞에 리턴값이 없음을 뜻하는 키워드 void를 사용하지는 않고, 단지 아무 것도 적지 않는다. 생성자의 조건은 다음과 같다. 


1. 생성자의 이름은 클래스의 이름과 같아야 한다. 
2. 생성자는 리턴 값이 없다. 

[참고]생성자도 오버로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 있을 수 있다. 

생성자는 다음과 같이 정의한다. 

클래스이름(타입 변수명, 타입 변수명, ... ) { 
/* 인스턴스 생성 시 수행될 코드, 주로 인스턴스멤버의 초기화 코드를 적는다. */ 


예) 
class Card { 
     Card() {       // 매개변수가 없는 생성자. 
          //... 
     } 

     Card(String k, int num) {       // 매개변수가 있는 생성자. 
          //... 
     } 
     //... 
}


사실 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것은 아니다. 생성자라는 용어 때문에 오해하기 쉬운데, 생성자는 단순히 인스턴스변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다. 생성자가 갖는 몇 가지 특징만 제외하면 메서드와 다르지 않다. 

Card클래스의 인스턴스를 생성하는 코드를 예로 들어, 수행되는 과정을 단계별로 나누어 보았다. 


Card c = new Card(); 

1. 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다. 
2. 생성자 Card()가 호출되어 수행된다. 
3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다. 
금까지 인스턴스를 생성하기위해 사용해왔던 '클래스이름()'이 바로 생성자였던 것이다. 인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중의 하나를 선택하여 지정해주어야 한다. 

기본 생성자(default constructor)

지금까지는 생성자를 모르고도 프로그래밍을해 왔지만, 사실 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다. 
그러나 지금까지 클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자(default constructor)' 덕분이었다. 

컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 아래와 같은 내용의 기본 생성자를 추가하여 컴파일 한다. 


클래스이름() { }

Card() { }


컴파일러가 자동적으로 추가해주는 기본 생성자는 이와 같이 매개변수도 없고 아무런 내용도 없는 아주 간단한 것이다. 
그 동안 우리는 인스턴스를 생성할 때 컴파일러가 제공한 기본 생성자를 사용해왔던 것이다. 특별히 인스턴스 초기화 작업이 요구되어지지 않는다면 생성자를 정의하지 않고 컴파일러가 제공하는 기본 생성자를 사용하는 것도 좋다. 
[참고]클래스의 접근제어자(Access Modifier)가 public인 경우에는 기본생성자로 'public 클래스이름() {}'이 추가된다. 

컴파일러가 자동적으로 기본생성자를 추가해주는 경우는 '클래스 내에 생성자가 하나도 없을 때'뿐이라는 것을 명심해야한다. 


매개변수가 있는 생성자.

생성자도 메서드처럼 매개변수를 선언하여, 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다. 인스턴스마다 각기 다른 값으로 초기화되어야하는 경우가 많기 때문에 매개변수를 사용한 초기화는 매우 유용하다. 
아래의 코드는 자동차를 클래스로 정의한 것인데, 단순히 color, gearType, door 세 개의 인스턴스변수와 두 개의 생성자만을 가지고 있다. 


class Car { 
      String color;             // 색상 
      String gearType;       // 변속기 종류 - auto(자동), manual(수동) 
      int door;                   // 문의 갯수 

      Car() {} 
      Car(String c, String g, int d) { 
            color = c; 
            gearType = g; 
            door = d; 
      } 



Car인스턴스를 생성할 때, 생성자 Car()를 사용한다면, 인스턴스를 생성한 다음에 인스턴스변수들을 따로 초기화해주어야 하지만, 매개변수가 있는 생성자 Car(String color, String gearType, int door)를 사용한다면 인스턴스를 생성하는 동시에 원하는 값으로 초기화를 할 수 있게 된다. 
인스턴스를 생성한 다음에 인스턴스변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 활용하는 것이 코드를 보다 간결하고 직관적으로 만든다. 

 

위의 양쪽 코드 모두 같은 내용이지만, 오른쪽의 코드가 더 간결하고 직관적이다. 이처럼 클래스를 작성할 때 다양한 생성자를 제공함으로써 인스턴스 생성 후에 별도로 초기화를 하지 않아도 되도록 하는 것이 바람직하다. 

생성자에서 다른 생성자 호출하기 - this

같은 클래스의 멤버들간에 서로 호출할 수 있는 것처럼 생성자간에도 서로 호출이 가능하다. 단, 다음의 두 조건을 만족시켜야 한다. 


- 생성자의 이름으로 클래스이름 대신 this를 사용한다. 
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다. 

출저: http://linuxism.tistory.com/1259


생성자의 특징

생성자의 특징은 아래와 같이 정리할 수 있다.

  • 값을 반환하지 않는다. 
    생성자는 인스턴스를 생성해주는 역할을 하는 특수한 메소드라고 할 수 있다. 그런데 반환 값이 있다면 엉뚱한 객체가 생성될 것이다. 따라서 반환 값을 필요로하는 작업에서는 생성자를 사용하지 않는다. 반환 값이 없기 때문에 return도 사용하지 않고, 반환 값을 메소드 정의에 포함시키지도 않는다.
  • 생성자의 이름은 클래스의 이름과 동일하다.
    자바에서 클래스의 이름과 동일한 메소드는 생성자로 사용하기로 약속되어 있다.

출저: https://opentutorials.org/module/516/5519


7. C#에서 캡슐화를 위해 제공되는 문법이 무엇인지 설명하시오.

In My Point)
캡슐화는 OOP의 3대 속성? 개념 중 하나로써 OOP의 목적 중 하나인 결집력을 낮추고 응집도를 높히는 기능 중 하나로써 겉을 감싸고 외부로 부터 보호하는 것이다. getter setter 문법이 있다. 외부에서 클래스를 접근하지 않고서는 내부 변수를 변하지 않게 한다. 캡슐화를 통해서 얻을 수 있는 이득은 외부인터페이스와 독립성을 유지함으로써, 외부 인터페이스가 변하더라도 내부의 코딩은 변경할 필요 없이 사용할 수 있다. 요런느낌
public class A
{
private int a;
public int a
{
get{ return a;}
set{ a = value;}
}
}

A obj = new A();
obj.a = 100; // set
Console.WriteLine(obj.a); // get
이런식으로 만든다



이번 항목에선 C++ 프로그래밍에서 사용되는 캡슐화(encapsulation)에 대한 이야기들이다. 철학적인 이야기도 나오기 때문에, 보는 중간에 졸음까지 잤었지만, 자다가 일어나서 다시 읽을 때의 신선함 때문이라도, 꽤 재미있는 항목이라 나는 생각한다.
스타일데로 캡슐화에 대한 질문들을 시작해 보자,.

1 ) "캡슐화"가 뜻하는 바는 무엇이며, 객체지향적 설계와 프로그래밍에서 그것이 얼마나 중요한가?
책에선 "캡슐화" 라는 뜻부터 풀어 보는데, 캡슐화란 "내부 구현을 숨기고 감싸서 보호하는 것" 이다. 즉, 외부와 연결된 인터페이스가 내부에 의존하지 않는다면, 클래스 내부의 변화는 외부와 연결된 인터페이스에 영향을 미치지 않음으로써, 보호 되는 것이다.

그렇다면, 객체지향적 설계와 프로그래밍에서 그것이 얼마나 중요 할까?
객체지향을 먼저 풀어 보면, "자료와 그 자료에 기반된 함수들의 결합" 으로 풀어 볼 수 있다. 캡슐화는 "내부 구현을 숨기고 감싸서 보호하는 것" 라고 위에서 정의 했었다.
여기서 객체지향을 구현 함에 있어, 캡슐화를 사용 한다는 것은, "자료나 그 자료에 기반된 함수들의 결합은 객체의 응집도(cohesion)를 높이고, 이 내부 구현을 숨기고 감싸서 보호하므로써, 내부 구현과, 외부 인터페이스의 결합도를 낮춤으로써 객체지향을 극대화" 시키는 것이다.
높은 응집도는 객체지향의 본질을 더 높여주고, 낮은 결합도는 더 자유로운 코딩을 할 수 있게 하는 것이다.
이제 이 질문에 대답할 수 있을거 같다. "객체지향의 유용성을 높이는 만큼, 중요하다"

출저: http://ikpil.com/811



객체지향 프로그래밍(OOP)에서 가장 중요하게 다루는 3가지 개념이 있습니다. 그것은 바로

  • 캡슐화 (encapsulation)
  • 상속 (inheritance)
  • 다형성 (polymorphism)

입니다. 이번 포스트를 통해서 그 중 캡슐화에 대해 간단히 정리해 보는 시간을 가져보지요.

 

 

일상 생활에서 캡슐화(encapsulation)

사전적인 의미로서 캡슐화는 무엇인가를 캡슐에 넣음을 의미합니다. 우리가 일상생활에서 가장 많이 접하는 캡슐이 바로 알약이지요. 캡슐에 약을 넣고 그것을 닫지요. 이것이 캡슐화의 한 예입니다. 알약은 캡슐과 약(가루 또는 알갱이)로 구성됩니다. 그렇다면 약국에서 캡슐이 왜 사용될까요? 가장 큰 이유는 먹기 편하기 때문이죠. 또 다른 이유는 캡슐의 크기가 정해져 있기 때문에 약의 섭취량을 조절하기가 쉽습니다. 캡슐 없이 약을 먹는 것이 불가능하지는 않습니다. 하지만 담을 수 있는 양이 각기 다른 숟가락 등으로 약을 먹는 것은 권장량보다 더 많은 약을 먹을 가능성이 있습니다. 즉, 약이 남용될 수가 있는 거죠. 이런 저런 이유로 캡슐에 담은 약은 우리에게 유용합니다.

 

 

OOP에서 캡슐화(encapsulation)란?

약에서와 마찬가지로 OOP에서도 캡슐화 개념이 적용됩니다. IT 산업이 발달하면서 프로그램에 저장되는 데이터양이 폭발적으로 늘어나고 있습니다. 이에 따라 변수나 메소드(함수)들 역시 비례하여 증가합니다. 프로그래머들이 이들을 보다 효과적으로 사용 및 관리할 수 있어야 합니다. OOP에서는 캡슐화라는 개념을 지원하여 변수 및 메소드들이 어떤 영역에 속하는지를 프로그래머가 결정하는 것을 도와줍니다. 캡슐화의 뜻은 다음과 같이 정리할 수 있습니다.

 

관련있는 데이터와 코드를 한 울타리 안으로 모으는 것

 

 

캡슐화를 어떻게 하는가?

그렇다면 캡슐화를 어떻게 할 수 있을까요? 클래스를 배운 분들은 이미 캡슐화를 경험해보셨습니다. 우리들은 클래스를 정의할 때 그 안에 여러가지 필드(field: C++에서는 멤버 변수라고 합니다.)들과 메소드(method: C++에서는 멤버 함수라고 합니다.)들을 정의해 보았습니다. Person이라는 클래스를 정의할 때, 사람과 관련된 데이터들과 코드를 그 안에 정의하였지요. 사람에 속하지 않는 자동차의 바퀴 등과 같은 데이터는 Person이 아닌 다른 클래스에 속해야 합니다. 이것이 바로 캡슐화입니다. 캡슐화하는 방법은 다음과 같이 정리합니다.

 

하나의 클래스 안에 필드들과 메소드들을 정의한다. 단, 이들은 클래스의 특성과 관련되어야 한다.

 

 

캡슐화와 정보 은닉(information hiding)

앞에서 말씀드렸듯이 필드들과 메소드들은 클래스 안에 캡슐화됩니다. 그리고 이들은 공개 범위를 정할 수가 있지요. 이것은 정보 은닉(information hiding)과 관계됩니다. 이에 대해서는 별도 포스트로 설명드리겠습니다.



출저: http://m.blog.naver.com/netrance/110096417364




8. 다형성을 활용할 때 어떤 장점을 얻을 수 있는지 설명하시오.

In My Point
다형성이란 OOP의 대표 개념중 하나다. 내생각에 다형성은 클래스의 기능을 강제하는 것이 더강하다. 인터페이스와 추상화에서 사용하는데 나는 인터페이스에서 더 많이 사용하였다. 다형성은 클래스, 상속에 개념을 선행해야 조금 더 이해하기 쉬운것 같다. 인터페이스란 스펙을 규정하는 것이라고 말할 수 있다. 추후 인터페이스와 추상메서드에 대한 이야기는 나중에 하기로 한다. 다형성의 문법을 통해 보는 것이 편할 듯 싶다

class A{}
class B : A{}
class C : A{}

A obj = new A(); // 가장 기본적인 객체 생성
A obj2 = new B(); //이게 다형성

데이터 타입은 부모 클래스 A지만 객체를 생성하는 것은 자식 클래스를 통해 만든다. 이럴 경우 자식의 속성을 띈 부모타입의 객체가 생성된다. (이거 자바랑 다름 확인해봐야 함) 더 하면 길어지니 여기까지
장점은 코드수를 줄일 수 잇다
예제 봐야하는데....
abstract class Main
{
public abstract void sum();
}
class Sub : A
{
public void sum(){
System.out.println("sum...");
}
class Sub2 : A
{
public void sum(){
System.out.println("sum2...");
}
class Polymorphorism{
class Execute(A a){
System.out.println("Execute");
}

public static void main(String[] args){
A obj = new Sub();
A obj = new Sub2();

Execute(obj);
Execute(obj2);
}
}

만약 이런 예제가 있다고 한다면 execute에 파라미터 데이터 타입은 A이다. 만약 이걸 Sub, Sub2이렇게 설계한다면 Execute는 각각 파라미터에 맞춰 생성자를 만들던가 다른 클래스 혹은 오버로드를 해야 할 것이다.
그런데 다형성을 이용한다면 코드를 줄일 수 잇게 할 수 있다.





-----------------abstract의 특징-----------------

in my point
추상화 클래스는 무조건 상속을 받는 클래스를 만들어야 한다.
자식 클래스는 부모 클래스의 상속 메소드를 구체화 시켜야 한다
추상화 클래스(부모클래스)에서의 추상 메소드는 본체 없이 (); 로 끝나야함
추상화 클래스 내에 여러 메소드들이 잇을 수 있다. 그중 하나라도 추상화 메소드가 있으면
클래스는 추상화 시켜야 한다. 그래서 추상화 클래스 내에는 구체화된 메소드가 있을 수 있다.




상속을 강제하기 위해 만든 규제
abstract로 지정된 메소드나 클래스는 직접 사용할 수 없고 반드시 상속한 클래스를 만들어서
상속한 클레스를 사용하게 하는것

상속을 강제하여 사용하게 하는 것

추상클래스안에 메소드는 본체 없이 메소드 (); 이렇게 끝남

상속을 강제한다!

추상 클래스는 구체적인 로직을 담고 잇지 않지만 형식 signiture만 담고 있다

구체적인 형식은 상속 받은 클래스에서 책임진다

메소드들 중 한가지라도 abstract라면 클래스는 반드시 추상화 클래스가 되어야 한다

추상 클래스는 구체적인 메소드를 가질 수 있다.

3) 인터페이스와 다형성
어떤 클래스가 어떠한 인터페이스를 구현하고 있다면,
그 클래스의 인스턴스는 인터페이스 일 수 있다.





다형성(Polymorphism)
키보드 - Enter (입력)
- Esc (취소)

똑같은 키보드에 키에 따라 다른 기능을 실행한다

1) 오버로딩:
같은 메소드지만 매개변수에 따라서 실행이 달라짐

2) 클래스와 다형성
A obj = new B();

클래스 B로 인스턴스를 만들었지만 A 타입으로 만들어짐


각각의 자식 클래스에서 오버라이된 값을 출력함
동일한 데이터 타입으로 존재하지만, 각각의 클래스의 메소드를 실행할 때
각자 오버라이된 값으로 진행된다.



다형성, 클래스, 상속, 오버라이딩 -> 다형성




[다형성장점,필요성]객체지향 다형성(Polumorphism)이 주는 장점, 추상클래스, 인터페이스,상속, 상위타입 캐스팅, 다형성은 객체지향 3대특징(상속,다형성,캡슐화)중 하나이다...

다형성이란 상위클래스 타입의 변수에 여러개의 하위클래스의 객체를 참조할 수 있도록 하는것을 이야기 한다.  즉 같은 타입이지만 오른쪽에 실제 런타임중에 new되는 객체(하위클래스)의 
메소드가 실행되어 동일한 메소드가 다양한 형태를 표출한다는 것 이다. 

다음과 같은 장점이 있다. 

1. 여러 타입의 객체를 하나의 타입으로 관리하니 유지보수가 좋다. 
(변경 사항 발생시 다형성으로 구현하지 않았을 때의 절반이상 코딩양 준다.) 

2. 메속드의 매개변수(인자)로 상위 클래스, 추상 클래스, 인터페이스등이 온다면 
그 하위클래스, 인터페이스를 구현한 클래스등이 인자로 들어 갈 수 있어 좀 더 
유연한 프로그래밍을 할 수 있다. (당연히 이부분도 프로그램의 유지보수 차원에서 좋다) 

3. 확장성이 좋은 코드를 작성할 수 있고, 결합도가 강하지 않은 프로그래밍을 할 수 있다.

출저: http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecCsharp&wr_id=225




다형성이란?

다형성이란 여러가지 형태를 가질 수 있는 능력을 뜻하며,

자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현한다다시 말해조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 한다.

 

다형성의 특징

-조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.

 그렇게 되면 조상클래스 타입의 참조변수로 자손클래스에 있는 멤버들에 접근할 수 있다.

 조상클래스에서 상속받은 멤버들만 접근할 수 있고자손클래스에서 만들어진 멤버들에는

 접근할 수 없다.

-자손타입의 참조변수로 조상타입의 인스턴스는 참조할 수 없다.

-반드시 상속관계가 이뤄져야 한다.

 

다형성은 어떤 경우에 사용하는가?

-하나의 참조변수로 여러타입의 객체를 참조할 때.

-여러(자손)클래스의 객체들을 하나의(조상)클래스의 배열로 묶어 다룰 경우.

-하나의 매개변수로 여러 타입의 참조변수를 받을 경우.

 

다형성을 사용함으로써 생기는 장점

-좀 더 객체지향적인 프로그래밍을 짤 수 있다.

-여러 클래스들을 하나의 배열로 묶어 다룰 수 있기 때문에 반복문등을 사용하는등

 편리하게 사용할 수 있다가령 클래스안의 특정 수들을 더하고자 할 경우 객체마다 별도로

 계산을 하려면 복잡하지만 하나의 배열로 묶으면 반복문을 사용하면 훨씬 짧은 코드로

 쉽게 구현할 수 있다.

-객체의 참조변수를 매개변수로 받을 경우객체의 타입마다 그 타입에 맞춰 매개변수를 생성하게 되면 매개변수의 개수도 계속 늘어나게 되어 코드가 복잡해지고 유지보수에도 어려움이 따르지만 조상클래스 타입의 참조변수 하나를 매개변수로 사용하게 되면 그 메서드 하나만으로

구현을 할 수가 있어 코드가 훨씬 간단해지고 유지보수도 수월하다.



출저: http://siking.tistory.com/61

9. 인터페이스를 활용하는 이유를 설명하시오.

In My Point
: 인터페이스란 스팩이다. 스펙에 여러가지 의미가 담겨져 있겠지만 이해를 돕기 위해 한가지 예시를 들겠다. 롯데정보통신에 들어오기 위한 스팩은 4년제, 학점, 어학점수, 자소서, 자격증, 봉사활동, 대외활동 이렇게 예를 들어 보겠다. 인터페이스란 이렇게 규격을 정하는 것이다. 인터페이스로 이러한 스펙을 지정하게 된다면 상속을 받는 클래스는 무조건 초기화된 저 스펙 규격에 맞춰서 (아 예시 좀아쉽네.. 무튼) 적어야 한다. 추상화와 비슷한 면도 있다. 그러나 추상화는 실행되는 메소드가 있을 수 있지만 인터페이스는 signiture만 있지 완전히 돌아가는 메서드는 없다. 인터페이스를 사용하는 이유는 어떤 프로그램을 만들때 꼭 필요한 것들을 강제 시켜 만들게 함으로써, 프로그래머가 조금더 신경을 덜쓰고, 생산성을 높이기 위해 활용한다고 생각한다.



죽음의 다야몬드를 피하기 위해서다? <= 이해안됨

인터페이스는 내가 배운 개념중에서 가장 이해가 안가고 왜 있어야되는지를 아직도 잘 모르겠는 것 중에 하나다. 사실 인터페이스에 대한 내용을 싣기에는 부족한 내공이지만 배우고 안 만큼만 블로그를 통해서 적어보려고 한다.

 인터페이스라는 녀석은 아주 간단한 형태를 띠고 있다. class 라는 선언문 대신에 interface 라고 선언을 하고.. 그 안에는 접근제어자(Access Modifier : public protected private) 가 없는 메소드만이 존재할 수 있게 된다.

<Interface 님의 심플한 자태>
  1. interface INoodle   
  2.   {   
  3.       void cookPasta();   
  4.       void cookRamen();   
  5.   }  
 아주 심플한 모습인데.. 왜 이런 뼈다귀 같은 구조를 짜놓으며 왜 이런 구조의 인터페이스가 필요한 걸까? 메소드를 선언하는 것 자체가 흡사 추상 클래스의 추상 메소드와 비슷하게 생겼는데.. 이렇게 되면 추상메소드 처럼 인스턴스를 직접 생성하지 못하지만 더 재미있는 것은 이를 상속(구현이지만)받게 되면 결국은 저 인터페이스에 맞게 메소드 이름을 짜줄것 같으면 그냥 클래스로 선언하는게 더 나을것 같다. 딱히 재사용 되는 자원들도 하나도 없으니깐 말이다.

그러면 왜 이런 인터페이스를 사용하는 것일까?

좀 이해가 안가는 내용이지만 인터페이스가 나오게 된 이유로 거슬러 올라가 보면 그 가운데는 '다중 상속' 이라는 것이 있다. 상속이라는 관계는 본디 일대다 로만 이루어 진다. 다시 말해 어떤 한개의 클래스를 상속받은 클래스는 다수가 존재할 수 있지만 상속을 받은 클래스의 부모 클래스가 여러개 일수는 없다. 정말 안좋은 결과를 초래하는 죽음의 다이아몬드가 그려질 수 있다는 것이다.


저런 다중 상속에서 생기는 문제는 위에 다이어그램에서 처럼 메소드 이름이 같다면 과연 어떤 것에서 호출해야 할지를 모른다는 것이다. 이처럼 다중 상속에서 생기는 문제점을 막으면서 여러 타입의 클래스의 형태를 띨 수 있는 방법은 무엇일까 해서 나온게 인터페이스이다. 인터페이스는 상속과는 다르게 여러가지 인터페이스를 구현(Implementation) 할 수 있다. 때문에 아래와 같은 선언이 가능해진다는 것이다.

  1. class SeoulRestaurant : INoodle, ISoup   
  2.     {   
  3.         public void cookPasta()   
  4.         {   
  5.         }   
  6.   
  7.         public void cookRamen()   
  8.         {   
  9.         }   
  10.   
  11.         public void cookBrocolliSoup()   
  12.         {   
  13.         }   
  14.   
  15.         public void cookChickenSoup()   
  16.         {   
  17.         }   
  18.     }  
두가지의 인터페이스에 정의되어있는 모든 메소드들을 사용할 수 있도록 클래스를 만들어야 한다. 이로서 SeoulRestaurant 라는 클래스는 두가지 인터페이스를 구현하므로서 INoodle 의 인스턴스이기도 하고 ISoup 의 인스턴스이기도 한 객체가 된다. 그렇다면 인터페이스는 문법을 어기지 않고 컴파일러에 혼란을 주지 않으며 다중 상속을 우회적으로 사용하는 그런 용도로 사용이 되는 것일까?

그 말도 맞지만 추상클래스를 사용하는 이유에서 처럼 인터페이스의 추상화된 메소드를 제공한다. 이 때문에 파생될 클래스들에 메소드 오버라이드를 통하여 문법을 지키도록 유도하고 다중상속이 가지는 강력함을 더하면서 동시에 발생할 수 있는 문제점들도 해결하게 되었다. 또한 디자인 패턴의 많은 예제 코드들이 이 인터페이스를 설계하는 것으로 부터 많이 시작한다. 단순히 뼈대를 제공하는 것 뿐만아니라 더 큰 의미에서 최소한의 수정을 통해서 변화에 대응 할 수 있도록 하기 위한 유연한 프로그래밍의 설계의 근간이 된다.

인터페이스에 대한 설명은 사실 말보다는 실제 소스를 이용하여 설명하는 것이 맞다... 때문에 디자인 패턴에 대한 추가적인 학습이나 패턴 지향 리팩토링을 통해서 더 공부할 필요가 있다.

출저: http://blog.lifeis.gift/679




1. 개발시간을 단축시킬 수 있다.
일단 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능하다.
메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문이다.
그리고 동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 하여,
인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고도 양쪽에서 동시에 개발을 진행할 수 있다.

2. 표준화가 가능하다.
프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음,
개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.

3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은
서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

4. 독립적인 프로그래밍이 가능하다.
인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에
실제구현에 독립적인 프로그램을 작성하는 것이 가능하다.
클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면,
한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

출저: https://kldp.org/node/129188



10. 배열의 두드러지는 단점과 배열을 대체하기 위한 대표적인 컬렉션 클래스를 설명하시요.

In My Point
- 초기 배열 크기를 선언하면 나중에 못바꿈
- 수정하고 삭제할 시 까다롭게 작업해야함

List, HashMap이 단점 해결 (물론 list랑 해쉬맵의 단점도 있음)




(1) 배열의 장단점


장점

- 구현이 쉽다

- 검색 성능이 좋다. 인덱스를 이용한 무작위 접근(random access)이 가능하므로 검색에서 빠른 성능을 기대할 수 있다.

- 순차 접근(sequential access)의 경우에도 배열은 데이터를 하나의 연속된 메모리 공간에 할당하므로 연결 리스트보다 빠른 성능을 보인다.

- 참조를 위한 추가적인 메모리 할당이 필요 없다.


단점

- 자료의 삽입과 삭제에 비효율적이다. 자료의 삽입과 삭제시 다음 항목의 모든 요소를 이동해야 하므로 많은 연산이 수행되어 비효율적이며 자료의 수와 비례하여 성능이 떨어진다.

- 크기를 바꿀 수 없다. 배열은 생성할 때 지정한 크기를 바꿀 수 없기 때문에 너무 크게 잡으면 메모리가 낭비되고 너무 작게 잡으면 그 이상의 자료를 저장할 수 없다. 새로운 배열을 만들어 사용하더라도 연산량이 많아져 효율이 떨어진다.

- 메모리의 재사용이 불가능하다. 배열은 초기 사이즈만큼의 메모리를 할당 받아 사용하기 때문에 데이터의 존재 유무와 상관없이 일정한 크기의 메모리를 점유한다. 즉 이미 삭제한 데이터라고 하더라도 배열 자체가 메모리에서 제거되지 않는 이상 삭제된 데이터의 메모리를 재사용 할 수 없다.


(2) 연결 리스트의 장단점


장점

- 자료의 삽입과 삭제에 효율적이다. 삽입이나 삭제할 자료의 전후 노드의 참조 관계만 수정해 주면 되기 때문에 삽입과 삭제하는 자료의 위치나 전체 자료수와 상관없이 일정한 성능으로 동작한다.

- 크기가 고정되어 있지 않다. 자료가 하나 삽입 될 때마다 생성되는 노드는 독립적인 공간의 메모리이기 때문에 물리적인 메모리의 범위 내에서는 그 수의 제한이 없다.

- 메모리의 재사용이 가능하다. 자료의 삭제시 해당 노드의 참조가 사라지므로 나중에 Garbage Collector에 의해 가용할 수 있는 메모리로 전환된다.


단점

- 배열에 비해 구현이 복잡하다.

- 검색 성능이 좋지 않다. 특정 순서의 자료를 검색하더라도 처음부터 순차적으로 검색을 해야 하므로 배열에 비해 검색시간이 많이 소요된다. 또한 각 요소를 구성하는 노드들이 독립된 객체이므로 메모리에 산재해 있게 되어 배열보다 긴 접근 시간이 필요하다.

- 참조를 위한 추가 메모리 할당이 필요하다. 배열은 요소 하나에 대해 실제 저장될 데이터만큼의 메모리가 필요하디만 연결 리스트는 추가적으로 인접한 데이터에 대한 참조를 필요로 하므로 데이터의 크기가 작을 경우 참조를 위한 추가적인 메모리가 오히려 더 크게 잡힐 수도 있다.


* 저장할 데이터의 최대 개수가 정해져 있고 리스트의 중간에 데이터를 삽입, 삭제하는 작업이 많지 않으며 인덱스를 이용한 빠른 검색이 필요할 경우에는 배열을 사용하는게 효율적


* 저장될 데이터의 개수가 정해져 있지 않고 리스트의 중간에 데이터를 삽입하거나 삭제하는 작업이 많고 삽입, 삭제에 비해 특정 위치의 데이터를 검색하는 작업이 많지 않을 경우 연결 리스트를 사용하는게 효율적


출저 : http://hyeonstorage.tistory.com/258




List

List<int> list = new List<int>();

list.Add(2);

list.Add(3);

list.Add(7);


for (int i = 0; i < list.Count; i++)

{

    Console.WriteLine(list[i]);

}


foreach (int prime in list)

{

    Console.WriteLine(prime);

}


ArrayList

 ArrayList A = new ArrayList();

            A.Add("String");

            A.Add(1);


            foreach (Object n in A)

            {

                Console.WriteLine(n);

            }

 //자바와 달리 데이터타입 선언 안해도 오브젝트 형식으로 들어간다!!


HashMap

 Hashtable table = new Hashtable();


            table.Add(1, "사과");

            table.Add(2, "딸기");

            table.Add("3", "3랄까");

            table[4] = "감자";


            foreach (object obj in table.Keys)

            {

                Console.WriteLine(obj + ", " + table[obj]);

            }


11. string 객체가 가지는 대표적인 속성과 메서드를 7개 이상 나열하고, 간단히 설명하시오. 

In My Point
- 속성
 Chars[Int32] : 현재 char 개체에서 지정된 문자 위체 있는 String 개체를 가져온다.
 Length : 현재 String 개체의 문자 수를 가져온다.

- 메서드
ToString() : Object 문자열 반환
Trim() : 빈칸 제거
ToUpper() : 대문자 변환
ToLower() : 소문자 변환
Concat(object) : 지정된 개체의 문자열 표현을 만든다.
spit(string, string) : 찾아 자르기
equal(string) : 같은값인지 트루벨루 반환

IndexOf(char) :이 문자열에서 맨 처음 발견되는 지정된 유니코드 문자의 0부터 시작하는 인덱스를 보고합니다.

12. 예외(Exception)가 무엇인지 설명하고, 코드 내에서 예외를 처리하는 문법을 설명하시오.

In My Point
예외처리란 프로그래밍이 작동하는 도중 에러가 발생할 수 있다. 그러한 경우 그 에러를 예외 처리라는 프로그램 메서드로 처리하여 프로그래밍이 정상으로 작동하는 것 처럼 보이게 하는 것



C# 프로그램 실행 중 오류가 생기면 예외가 발생합니다. 예외가 발생하면 프로그램의 현재 흐름이 중지되고, 아무 작업도 수행되지 않는 경우에는 단순히 프로그램의 실행이 중지됩니다. 예외는 숫자를 0으로 나누는 것과 같은 프로그램 버그로 인해 발생하거나 사용자가 존재하지 않는 파일을 선택하는 것과 같은 예기치 않은 입력의 결과로 발생할 수 있습니다. 프로그램이 충돌로 인해 중단되지 않고 이러한 문제를 처리할 수 있도록 프로그래밍해야 합니다.

C#에서는 프로그램이 예외를 찾아 처리하고 실행을 계속할 수 있도록 하는 trycatch 및 finally 등의 여러 가지 키워드를 제공합니다. 이러한 키워드는 보다 안정적인 응용 프로그램을 만드는 데 아주 유용한 도구입니다

Try Catch Finally

try
{
    // Code to try here.
}
catch (SomeSpecificException ex)
{
    // Code to handle exception here.
}
finally
{
    // Code to execute after try (and possibly catch) here.
}

출저: https://msdn.microsoft.com/ko-kr/library/384webt3(v=vs.90).aspx




자, 이제 유연한 프로그래밍을 위한 예외처리의 기법에 대해서 살펴보자. 다음은 예외처리를 위한 try, catch문의 기본 구조이다.

try {
    ...
} catch(예외1) {
    ...
} catch(예외2) {
    ...
...
}

try문안의 수행할 문장들에서 예외가 발생하지 않는다면 catch문 다음의 문장들은 수행이 되지 않는다. 하지만 try문안의 문장들을 수행 중 해당예외가 발생하면 예외에 해당되는 catch문이 수행된다.

숫자를 0으로 나누었을 때 발생하는 예외를 처리하려면 다음과 같이 할 수 있다.

int c;
try {
    c = 4 / 0;
}catch(ArithmeticException e) {
    c = -1;
}

ArithmeticException 이 발생하면 c에 -1을 대입하도록 예외처리한 것이다.

finally

프로그램 수행 도중 예외가 발생하면 프로그램이 중지되거나 예외처리를 했을 경우 catch구문이 실행된다. 하지만 어떤 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있어야 한다면 어떻게 해야 할까?

Throw

class ProgramThrow
{
    static void DoWork(int x)
    {
        if (x > 5)
        {
            throw new System.ArgumentOutOfRangeException("X is too large");
        }
    }

    static void Main()
    {
        try
        {
            DoWork(10);
        }
        catch (System.ArgumentOutOfRangeException ex)
        {
            System.Console.WriteLine(ex.Message);
        }
    }
}


 Exception은 크게 두가지로 구분된다.

  1. RuntimeException
  2. Exception

RuntimeException은 실행 시 발생하는 예외이고 Exception은 컴파일 시 발생하는 예외이다. 즉, Exception은 프로그램 작성 시 이미 예측가능한 예외를 작성할 때 사용하고 RuntimeException은 발생 할수도 발생 안 할수도 있는 경우에 작성한다.

다른 말로 Exception을 Checked Exception, RuntimeException을 Unchecked Exception이라고도 한다

출저: https://wikidocs.net/229

예외 처리와 if문을 구별할때?

13. 델리게이트의 개념을 설명하시오.

In My Point
위임한다..? 메소드 형식같음 콜백 같은 역할?도 들은것 같음. 포인터처럼 바로 주소 참조 하는 거 처럼 해서 성능을 높힌다..?




델리게이트는 사용자정의형 이라고 정의 할 수 있습니다그렇다면 사용자 정의형 이라는뜻이 무엇인지 알아 봐야 될 것 같네요사용자 정의은절대 어려운 개념이 아닙니다사용자 정의형에 대표적인 예는 클래스(Class)입니다어떠한 특정 형식을 사용자가 정의 해 놓은 것을 의미 합니다아래 그림을 보고 이해 하도록 합시다
델리게이트(delegate)는 사용자 정의형으로 클래스(Class)와 같은 위치에서 선언됩니다그리고 선언 형식은 메서드(함수)와 동일한 형식으로 선언됩니다눈치가 빠른 사람이라면 델리게이트(delegate)는 메서드와 연관이 있다라는 것을 짐작했을 것입니다그럼 델리게이트가 가지고 있는 기능을 살펴 보도록 하겠습니다.

delegate void dele1();
    delegate int dele2(int a, int b);
    class DelegateDemo
    {
        public static void Main(String[] args) { 
        MathClass mc = new MathClass();
        dele1 Sum1 = new dele1(mc.Intro);
        dele2 Sum2 = new dele2(mc.Sum);
        }

    }
    class MathClass
    {
        public void Intro()
        {
            Console.WriteLine("계산을 시작합니다.");
        }
        public int Sum(int a, int b)
        {
            return a + b;
        }
    }

델리게이트(delegate)의 연산

델리게이트 객체는 Combine Remove 라는 두개의 연산 메서드를 지원합니다이것은 델리게이트가 여러 메서드의 참조가 가능하다는 것입니다

-Combine: 기존의 위임에 또 다른 위임을 추가합니다.           =[+]

-Remove: 기존의 위임에 특정 위임을 제거합니다.                 =[-]



출저: http://hoons.net/lecture/view/66




14. 프로그램 내에서 여러 개의 스레드를 생성하는 이유를 설명하시오.

장점[편집]

  1. 응답성 : 대화형 프로그램을 멀티스레드화하면, 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속되어, 사용자에 대한 응답성이 증가된다. 예를 들어, 멀티스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에 사용자와의 상호 작용이 가능하다.
  2. 자원 공유 : 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드 공유의 이점은, 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 활동성 스레드를 가질 수 있다는 점이다.
  3. 경제성 : 프로세스 생성에 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에, 스레드를 생성하고 문맥교환을 하는 편이 보다 경제적이다.
  4. 멀티프로세서 활용 : 멀티프로세서 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다. 단일 스레드 프로세스는 CPU가 많아도 CPU 한개에서만 실행된다. 즉, 다중 스레드화를 하면 다중 CPU에서 병렬성이 증가된다.

단점[편집]

  • 다중 스레드는 캐시나 변환 색인 버퍼(TLB)와 같은 하드웨어 리소스를 공유할 때 서로를 간섭할 수 있다.
  • 하나의 스레드만 실행 중인 경우 싱글 스레드의 실행 시간이 개선되지 않고 오히려 지연될 수 있다.
  • 멀티스레딩의 하드웨어 지원을 위해 응용 프로그램과 운영 체제 둘 다 충분한 변화가 필요하다.
  • 스레드 스케줄링은 멀티스레딩의 주요 문제이기도 하다.

출저: https://ko.wikipedia.org/wiki/%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%94%A9




멀티 스레드는 응답성을 높여줍니다.


사용자 대화형 프로그램의 응답성을 높일 수 있습니다.

하나의 프로세스의 여러 스레드를 생성하여 스레드에 각기 다른 작업을 하게 함으로써 특정 작업을 하면서도 사용자로부터 명령을 입력받게 할 수 있습니다.



멀티 스레드는 자원공유 효율성을 높여줍니다.

프로세스간 데이터 교환보다 번거로운 작업 없이 더 효율적입니다.

IPC를 통한 프로세스간 데이터 교환
스레드간 데이터 교환
      

o IPC를 통한 프로세스간 데이터 교환

프로세스간 데이터 교환을 하려면 소켓이나 공유 메모리같은 IPC(Inter Process Communicatin)을 이용해서 데이터 교환을 해야 합니다.

o 스레드간 데이터 교환

프로세스를 뛰우기 위해 메모리와 자원을 할당하는 작업없이 이미 프로세스에 할당된 자원과 메모리를 그대로 사용하여 스레드를 생성하여 작업하므로 메모리와 자원 할당에 필요한 비용을 줄일 수 있습니다.
   
멀티 스레드에 문제 발생시 전체 프로세스가 영향을 받습니다.


o 멀티스레드 구조

멀티스레드 구조에서 자식 스레드중 하나에 문제가 생긴 경우 전체 프로세스가 영향을 받게 됩니다.

15. 동기적 처리와 비동기적 처리를 비교해서 설명하시오.

동기적

  어떤 작업을 요청했을 때 그 작업이 종료될 때까지 기다린 후 다음(다른) 작업을 수행하는 방식

비동기적
 
  어떤 작업을 요청했을 때 그 작업이 종료될 때 까지 기다리지 않고 다른 작업을 하고 있다가, 요청했던 작업이 종료되면 그에 대한 추가 작업을 수행하는 방식

16. SELECT, FROM, WHERE, GROUP BY, HAVING 구문을 동시에 사용했을 경우, 처리되는 순서를 나열하시오.


(8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list>

(1)  FROM <left_table>

(3)      <join_type> JOIN <right_table>

(2)          ON <join_condition>

(4)  WHERE <where_condition>

(5)  GROUP BY <group_by_list>

(6)  WITH {CUBE | ROLLUP}

(7)  HAVING <having_condition>

(10) ORDER BY <order_by_list>


출저: http://devlsh.tistory.com/entry/SQL-Server-%EB%85%BC%EB%A6%AC%EC%A0%81-%EC%BF%BC%EB%A6%AC-%EC%B2%98%EB%A6%AC-%EC%88%9C%EC%84%9C





From

where

group by 

having

select


17. JOIN을 사용하는 이유를 설명하시오.

In My Point
데이터베이스는 데이터를 보다 효율적이고 관리를 잘하기 위해 만든다. 데이터는 DB -> 스키마 -> 테이블 이런 순서로 저장되게 되는데 사용자가 원하는 데이터의 중복을 줄이고보다 효율적으로 관리하게 하기 위해서 DBA는 테이블을 정규화라는 과정을 통해 관리한다. 정규화를 하게 되면 데이터들은 테이블로 나뉘게 되는데 원하는 데이터들의 합이나, 계산 처리 과정을 위해서는 테이블을 다시 합쳐야 할 필요가 있다. 이러한 일련의 과정을 Join이라고 한다.

18. 인덱스를 사용하는 이유를 설명하시오.

In My Point
DB에는 데이터들이 차례대로 담겨져 있다. 그런데 데이터들은 순차적으로 저장공간에 저장되어 있는 것이 아니다. 사용자가 원하는 데이터를 추출(select)하려 할 때 DB는 순차적으로 데이터를 저장공간에서 찾아 뽑아온다. index는 데이터베이스의 저장된 공간의 주소를 가리키는 것이다. 해쉬랑 약간 비슷한 개념인데 해쉬에서 key - value가 매핑 되어있다면 index - 정보 이렇게 된것. 그렇기 때문에 빠르게 검색할 수 있다.





인덱스는 특정 칼럼 값을 가지고 있는 열을 빠르게 찾기 위해서 사용된다. 


MySQL은 첫 번째 열부터 전체 테이블에 걸쳐서 연관된 열을 검색하기 때문에 테이블이 크면 클 수록 비용이 엄청나게 늘어난다. 


만약 테이블이 쿼리에 있는 컬럼에 대한 인텍스를 가지고 있다면, MySQL은 모든 데이터를 조사하지 않고도 데이터 파일의 중간에서 검색위치를 빠르게 잡아낼 수 있다. 


대부분의 MySQL 인덱스는 B-트리에 저장되며 그 종류는

 PRIMARY KEY, UNIQUE, INDEX, FULLTEXT 가 있다.


인덱스를 사용하는 이유 

WHERE 구문과 일치하는 열을 빨리 찾기 위해서.

열을 고려 대상에서 빨리 없애 버리기 위해서. 

조인 (join)을 실행할 때 다른 테이블에서 열을 추출하기 위해서.

특정하게 인덱스된 컬럼을 위한 MIN() 또는 MAX() 값을 찾기 위해서.

사용할 수 있는 키의 최 좌측 접두사 (leftmost prefix)를 가지고 정렬 및 그룹화를 하기 위해서.

데이터 열을 참조하지 않는 상태로 값을 추출하기 위해서 쿼리를 최적화 하는 경우에.


인덱스를 사용해야 하는 경우 

데이터 양이 많고 검색이 변경보다 빈번한 경우

인덱스를 걸고자 하는 필드의 값이 다양한 값을 가지는 경우 



출저 : http://ra2kstar.tistory.com/96


19. 트랜젝션이란 무엇인지 설명하시오.

In My Point
DB에 테이블들은 주로 관리를 위해 떨어져 있는 경우가 대부분이다. (이거 뭐 좋은 말로 바꾸자)
내가 아는 트렌젝션은 
1) 다른 테이블 A, B가 있을때 이게 비지니스적으로 A를 사면 B에서 어떤 데이터가 바껴야 한다면 트렌젝션을 걸어 A에서 어떤 데이터 값이 입력되거나 변경이 되면 B에서 바뀌도록 하는것 
2) Auto increasement 이거 뭐라그러지 identity이거엿나 만약 A에 값을 입력해야 하는데 필수 값으로 B의 기본키가 외래키로 잡혀 있다. 그런데 B의 경우 A에 종속되는 테이블로써 A의 값이 없으면 B의 기본키는 생성할 수 없다. 이럴때 A에 값을 집어 넣는 동시에 B에서 기본키 값이 생성되고 A에서 그 값을 참조하여 입력할 수 있게 할때




트랙잭션( transaction ) 개념을 말하자면

데이터베이스 내에서 한꺼번에 수행되어야할 일련의 연산들 입니다.
간단하게 말하자면 전부 되거나~~ 전부 안되거나~~

트랙잭션 의 모든 연산은 반드시 한꺼번에 완료가 되야 하며
 그렇지 않은경우에는 한꺼번에 취소되어야 하는 원자성을 가지고 있습니다

한꺼번에 완료가 된경우에는 성공적인 종료 COMMIT 

이 경우에는 작업결과는 데이터베이스에 반영이 되게 됩니다.

취소가 된경우에는 비정상적인 종료 ROLLBACK 

이 경우에 작업결과는 모두 취소되게 되어 데이터베이스에 영향을 미치지 않게 됩니다. 



이 트랙잭션에 성질들을 보게되면 

1. 원자성(Atomicity)

분리 할수 없는 하나의 단위로 작업은 모두 완료되거나 모두 취소 되어야 합니다.

2. 일관성(Consistency)

- 사용되는 모든 데이터는 일관되어야 합니다.

3. 격리성(Isolation)

 - 접근하고 있는 데이터는 다른 트랜잭션으로 부터 격리 되어야 합니다.

트랜잭션이 진행되기전과 완료된 후에 상태를 볼수 있지만

트랜잭션이 진행되는 중간 데이터는 볼수 없습니다.

4. 영속성(Durability)

- 트랙잭션이 정상 종료되면 그 결과는 시스템에 영구적으로 적용되어야 합니다.

5. 순차성(Sequentiality)

- 데이터를 다시 로드하고 트랜잭션을 재생하여 원래 트랜잭션이 수행된 후의 상태로

 데이터를 되돌리는 것을 말합니다.


트랙잭션의 예를 하나 들어 이해를 해볼게요ㅎㅎ


저는 카드하나를 들고서 은행 인출기 앞으로 갑니다.

처음에     카드를 넣습니다

두번째로     어떤거래를 할지 선택을하고

세번째로     비밀번호를 눌러 인증을 받고

네번째로     거래를 완료 하겠죠

이 네가지 과정을 묶어서 트랜잭션이라고 합니다.


거래까지 완료됬으면 COMMIT 

중간에 비밀번호를 틀리거나.. 인증을 받았는데 거래를 취소하거나 하는 일이

 발생해서 처음으로 돌아갈경우에는 ROLLBACK 이라고 합니다.

출저: http://121202.tistory.com/17


http://egloos.zum.com/springmvc/v/495798


DBMS는 어떻게 트랜잭션을 관리할까?

http://d2.naver.com/helloworld/407507



20. SQL Server와의 연동을 위해 ADO.NET이 제공하는 대표적인 클래스들과 각각의 역할을 간단히 설명하시오.

ADO.NET은 OLE DB 및 ODBC를 통해 노출되는 데이터 소스, SQL Server 및 XML과 같은 데이터 소스에 대한 일관성 있는 액세스를 제공합니다.  데이터 공유 소비자 응용 프로그램은 ADO.NET을 통해 이러한 데이터 소스에 연결하여 포함된 데이터를 검색, 처리 및 업데이트할 수 있습니다.  

ADO.NET은 데이터 조작에 따른 데이터 액세스를 각각의 구성 요소로 구분하여 개별적으로 또는 차례대로 사용할 수 있게 해 줍니다.  ADO.NET에는 데이터베이스에 연결하고 명령을 실행하며 결과를 검색하는 데 사용되는 .NET Framework 데이터 공급자가 포함됩니다.  검색된 결과는 곧바로 처리되거나 ADO.NET DataSet 개체에 저장되어 특별한 방식으로 사용자에게 노출되거나 여러 소스의 데이터와 함께 사용되거나 계층 간에 전달됩니다.   DataSet 개체는 또한 .NET Framework 데이터 공급자를 독립적으로 사용하여 응용 프로그램에 로컬인 데이터 또는 XML에서 가져온 데이터를 관리할 수 있습니다.  

출저: https://msdn.microsoft.com/ko-kr/library/h43ks021(v=vs.110).aspx

JPA같은거임



ADO.NET 데이터 공급자


출저: https://msdn.microsoft.com/ko-kr/library/dw70f090(v=vs.110).aspx


다시 한번 읽어 볼 것!


21. DAO 패턴이 무엇인지 설명하시오.

In My Point
Data Access Object의 약어로써 웹프레임워크에서 DB에 값을 전송할 때 객체화 시켜서 하는것인가? 뭐지? DRM기술인가? mybatis, hibernate 같은거 같음.... 다오페턴을 쓰게 되면 값을 불러올 떄 유용할것 왜냐햐면 데이터베이스에서 나오는 값이 음 셀렉트 에 출력값이 object안에 들어오게 되고 그 벨류값들이 DB에서 나온 데이터?





DAO란 Data Access Object의 약어로서 실질적으로 DB에 접근하는 객체를 말한다.

DAO의 사용 이유는 효율적인 커넥션 관리와 보안성 때문이다.


정의

DAO란? 한마디로 Database의 data에 access하는 트랜잭션 객체이다. 일종의 객체라는 것을 잊지말도록 하자. DAO는 저수준의 Logic과 고급 비지니스 Logic을 분리하고, domain logic으로부터 persistence mechanism을 숨기기 위해 사용한다. (적절히 디자인을 하면 모든 domain logic을 바꾸는 대신에 DAO를 바꾸기만 하면 된다.)

persistence 계층 : Database(영구 저장소)에 data를 CRUD하는 계층

// Create , Read , Update , Drop의 줄임말


설명

웹서버는 DB와 연결하기 위해서 매번 커넥션 객체를 생성하는데, 이것을 해결하기 위해 나온것이 컨넥션 풀입니다. ConnectionPool 이란 connection 객체를 미리 만들어 놓고 그것을 가져다 쓰는것입니다. 또 다쓰고 난 후에는 반환해 놓는 것. 하지만 유저 한명이 접속해서 한번에 하나의 커넥션만 일으키지 않고 게시판 하나만 봐도 목록볼때 한번, 글읽을때마다 한번, 글쓸때 한번 등등... 엄청나게 많은 커넥션이 일어나기에, 커넥션풀은 커넥션을 또 만드는 오버헤드를 효율적으로 하기 위해 DB에 접속하는 객체를 전용으로 하나만 만들고, 모든 페이지에서 그 객체를 호출해다 사용한다면? 이렇게 커넥션을 하나만 가져오고 그 커넥션을 가져온 객체가 모든 DB와의 연결을 하는것이 바로 DAO객체입니다^^


DAO(Data Access Object)는 DB를 사용해 데이터를 조화하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다.

 사용자는 자신이 필요한 Interface를 DAO에게 던지고 DAO는 이 인터페이스를
구현한 객체를 사용자에게 편리하게 사용 할 수 있도록 반환해줍니다.

 DB에 대한 접근을 DAO가 담당하도록 하여 데이터베이스 엑세스를 DAO에서만
하게 되면 다수의 원격호출을 통한 오버헤드를 VO나 DTO를 통해 줄일 수 있고
다수의 DB 호출문제를 해결할 수 있습니다. 또한 단순히 읽기만 하는 연산이므로
트랜잭션 간의 오버헤드를 감소할 수 있습니다.(?)



출저: http://genesis8.tistory.com/214



DAO(Data Access Object) 클래스 : 데이터베이스에 접근해서 작업을 하는 부분만을 소유한 클래스.

 

특별한 경우가 아니면 Singleton 패턴을 적용하는 것이 좋습니다.

데이터베이스에 변경을 가하는 작업이 없다면 Singleton패턴을 적용하지 않는 것이 좋습니다.

데이터베이스에 변경을 가하지 않는 작업은 동시에 몇개가 수행되어도 문제가 없지만,

데이터베이스에 변경을 가하는 작업은 동시에 2개 이상이 수행되지 않는 것이 바람직합니다.

은행이나 증권 프로그램들은 읽기 변경 작업을 하는 부분을 별도의 클래스로 생성해서 사용합니다.


출저: http://m.blog.naver.com/jihoon8912/220240747123




DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다. 보통 JDBC를 통해 구현된 객체이며 데이터베이스의 하나의 테이블에서 수행할 수 있는 CRUD를 전담하는 객체를 말한다.

출저: http://blog.daum.net/question0921/798


DAO

개념

데이터 접근을 목적하는 객체입니다커넥션 같은 것을 하나만 두고 여러 사용자가 DAO의 인터페이스를 사용하여 필요한 자료에 접근 하도록 하는 것이 DAO의 개념입니다.

필요성

모든 데이터베이스에 공통적으로 접속 할 수 있는 ODBC가 나왔지만 완벽하진 못했습니다여전히 로우 레벨의 API를 포함하고 있었기 때문에 개발 장벽이 여전히 높았습니다이런 이유 때문에 개발자들은 정작 데이터베이스에 들어 있는 데이터를 어떻게 이용할지에 초점을 맞추기 보다어떻게 데이터베이스에 접속해서 데이터베이스와 교류하는지에 더 초점을 기울였습니다즉 데이터를 활용하는 논리적 고민보다 기술적 고민에 더 많은 신경을 썻었습니다이런 이유로 DAO란 대안이 나왔습니다.

기대효과

사용자는 자신이 필요한 Interface DAO에게 던지고 DAO는 이 인터페이스를 구현한 객체를 사용자에게 편리하게 사용 할수 있도록 반환해줍니다.

장 단점

DB에 대한 접근을 DAO가 담당하도록 하여 데이터베이스 엑세스를 DAO에서만 하게 되면 다수의 원격호출을 통한 오버헤드를 VO DTO를 통해 줄일수 있고 다수의 DB 호출문제를 해결할 수 있습니다또한 단순히 읽기만 하는 연산이므로 트랜잭션 간의 오버헤드를 감소할 수 있습니다.

 그러나 Persistent Storage를 너무 밀접하게 결합해서 작성을 하게 되면 Persistent Stroage를 다시 작성할 경우가 생기는데 이러한 경우 유지 보수의 문제가 생길수도 있습니다.


출저: http://jaehyuk.tistory.com/128

22. 웹사이트 개발 시 HTML의 역할을 설명하시오.

In My Point
Hyper Text Markup Language 약어. 스크립트 언어라 컴파일 필요 없이 차례대로 읽어 내리며, 작동 스크립트 언어 특성상 컴파일 없이 작동 됨. 웹브라우저를 통해 규현됨. 돔형식으로 이루어졌음 디렉토리 처럼 폴더를 들어가면 또다른 폴더가 있고 이런형식을 돔형식이라고 함 Html은 웹브라우저에서 데이터를 약속한 형식에 따라 화면에 띄우는 역할



HTML이란 하이퍼텍스트 마크업 랭귀지(HyperText Markup Language)의 머리글자를 따서 만든 약자입니다.

조판(Markup) 또는 문서작성을 위한 언어(Language)는 언어인데 요것이 참 재미있는 특징이 있습니다. 우리가 흔히 인쇄된 책에서 보는 글자는 손으로 비비고 누르고 만져봐도 아무런 반응이 없습니다. 하지만 인터넷 브라우저에 나열된 글자는 마우스로 클릭하면 전혀 다른 그림과 문서들로 연결을 시켜주지요. 그래서 우리가 흔히 인쇄물(책 또는 신문 등)에서 보았던 보통의(Ordinary) 글자가 아닌 아주 활동적(Hyper)이고 특별한(Super) 글자(Text)라는 의미로 하이퍼텍스트(HyperText) 마크업 랭귀지(문서작성 언어)라고 표현하게 되었습니다.

HTML은 1989년 영국의 컴퓨터 과학자 “티머시 존 버너스리 경”(팀 버너스리)이 최초로 20개 정도의 약속된 단어로 HTML 태그(tag)라고 부르면서 일반에 공개한 것이 지금의 HTML이 되었습니다.

“하지만 그 이전에 인터넷은 군에서 먼저 만들었다고 설명했잖아요?” (※ 게시판 모듈 설치하기 참고)

예, 맞습니다. 하지만, 군 안에서 서로의 중요한 연락 및 통신을 위해 고안된 컴퓨터 프로그램은 일반사람들이 사용하기에는 너무나 어렵고 복잡(ASCⅡ)한 코드였습니다. 그리고 까만 모니터 화면에 하얀 글씨만 있던 아주 이상하고 볼품도 없었습니다. 과학자들은 고민에 빠졌습니다. “컴퓨터 A에서 작성한 문서가 B라는 컴퓨터에서도 똑같은 모양으로 나타나도록 하려면 어떻게 해야 할까? 그리고 일반 사람들도 쉽게 사용할 수 있는 방법이 없을까?”였고 그러면 우리 다같이 “쉬운 말로 약속을 하자. 줄임말을 이용해 컴퓨터 화면에서 글이 어떻게 정렬하고 크기는 어느 정도로 할 것인지, 그림의 크기는 어떻게 정할 것인지 스타일을 표현해 보자.”라고 만든 약속된 언어가 태그(Tag)이고 이것을 처음 주장한 사람은 팀 버너스리이며 지금의 HTML4.01까지 발전하게 되었답니다.


출저: http://www.xeschool.com/xe/htmlcss_01




23. CSS 스타일을 적용하는 방법 3가지를 설명하시오.

In My Point
1) css파일을 만들어 외부에서 참조하는 방식
2) 페이지 내 초기 스타일로 선언하여 
3) 지정할 부분에 스타일을 적용하는 방법

우선순위는 3이 제일 우선시 적용 1로 갈수록 나중에 적용됨

HTML문서에 CSS를 사용하는 방법은 3가지가 있습니다.

  • 외부 스타일 시트(External Style Sheet)
  • 내부 스타일 시트(Internal Style Sheet)
  • HTML태그내에 스타일 지정(Inline Styles)

외부 스타일 시트(External Style Sheet)

css라는 확장자를 가진 스타일 시트 파일을 만들고 이 파일을 HTML 문서에 연결하여 사용하는 방법입니다.

<head>
 <link rel="stylesheet" type="text/css" href="mystyle.css">
</head>

이 방법의 장점은 홈페이지 전체의 스타일을 일관성있게 유지하면서 변경시에도 일괄적으로 변경되므로 홈페이지 제작의 효율성을 극대화 할 수 있습니다.

반면 외부 스타일 시트 파일을 계속적으로 관리해주면서 HTML 문서를 만들어 나가야 하기에 불편한 경우가 있습니다. 그리고 외부 스타일 시트 파일이 지나치게 복잡해지면 곤란하므로 css파일을 관리하는 노하우가 필요합니다.

그럼에도 불구하고 전문적인 홈페이지를 만들려면 외부 스타일 시트를 적극적으로 활용해야 합니다.

내부 스타일 시트(Internal Style Sheet)

HTML문서내에서 <head>와 </head>사이에 스타일을 정의하는 방법입니다.

<head>
 <style type="text/css">
 <!--
  body {font-size:9pt;}
 //-->
 </style>
</head>

HTML문서마다 스타일을 매번 지정해 주어야 하지만, 한 문서에만 해당되는 스타일을 지정할때 사용하면 됩니다.

HTML태그내에 스타일 지정(Inline Styles)

위의 방법들에 비해서 적용범위가 더욱 좁아진 형태입니다. 스타일을 적용하고 싶은 HTML태그안에서 정의하는 방법입니다.

<p style="color:gray;">이 문단의 색상은 회색으로 지정됩니다.</p>

이 문단의 색상은 회색으로 지정됩니다.

내용과 스타일의 분리 그리고 이로 인한 스타일 일괄변경의 효율성 측면으로 볼때는 바람직하지 않는 방법입니다.

그러나 위의 소스에서도 보듯이 직관적으로 사용이 가능하다는 장점이 있기에 강좌를 진행할때는 주로 이 방법을 사용하겠습니다.


출저: http://www.homejjang.com/07/how_to.php

24. 웹 서버가 수행하는 역할을 설명하시오.

In My Point 
웹서버는 뭘까? 서버란 것은 로컬이 아닌 외부에서 접속할 수 있도록 만드는 것이다. 그중 웹서버는 웹페이지가 외부에서 보이도록 열어 놓는것 우리는 주로 웹페이지를 주로 많이 보게 됨. 기본적으로 하는 일은 웹페이지를 바깥에 보여주는 것을 기본으로 하며 데이터 량에 따라 분산처리 (Load Blancing)도 하며, 동적인 페이지 구현(like jsp, php, etc...), 세션을 통한 보조 서비스?(like 로그인 유지, 일주일간 안보기?, 장바구니?이건쿠키인가?) 



 서버(web server)는 다음의 두 가지 뜻 가운데 하나이다.

  1. 웹 서버 (소프트웨어) : 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
  2. 웹 서버 (하드웨어) : 위에 언급한 기능을 제공하는 컴퓨터 프로그램을 실행하는 컴퓨터

개요[편집]

웹 서버의 주된 기능은 웹 페이지를 클라이언트로 전달하는 것이다. 주로 그림CSS자바스크립트를 포함한 HTML 문서가 클라이언트로 전달된다.

흔히 웹 브라우저 또는 웹 크롤러로 부르는 클라이언트는 HTTP를 통해 리소스를 요청하며 서버는 해당 리소스를 반환하거나 처리할 수 없을 경우 에러 메시지를 전달한다. 이러한 리소스는 일반적으로 서버의 보조 기억 장치에 있는 실제 파일을 가리키지만 반드시 그런 것은 아니며 웹 서버가 어떻게 수행하느냐에 따라 달라질 수 있다.

주된 기능은 콘텐츠를 제공하는 것이지만 클라이언트로부터 콘텐츠를 전달 받는 것도 웹 서버의 기능에 속한다. 이러한 기능은 파일 업로드를 포함하여 클라이언트에서 제출한 웹 폼을 수신하기 위해 사용된다.

보통 대다수의 웹 서버는 Active Server Page(ASP), PHP 등의 서버 사이드 스크립트 언어(Server-side scripting)를 지원한다. 이는 서버 소프트웨어의 변경 없이도 웹 서버가 수행할 동작을 분리된 서버 사이드 스크립트 언어에 기술할 수 있다는 의미이다. 보통 서버 사이드 스크립트 언어를 통해 구현되는 기능이란 HTML 문서를 동적으로 생성하는 것을 말한다. 이렇게 동적으로 생성된 HTML 문서는 동적 컨텐트라 하는데 주로 데이터베이스의 정보를 조회해서 보여주거나 수정하기 위해 사용된다. 동적 컨텐트와 대비되는 개념으로 정적 컨텐트가 있는데 일반적으로 동적 컨텐트보다 더 빠르게 동작하고 쉽게 캐시될 수 있지만, 반환되는 컨텐트의 내용이 항상 동일하다.

웹 서버는 월드 와이드 웹 뿐만 아니라 프린터라우터웹캠과 같은 임베디드 장치, 그리고 근거리 통신망(local network)에서도 사용된다. 시스템의 모니터링 또는 장치 관리를 위한 목적으로 사용되는데, 이렇게 웹 서버는 클라이언트에 다른 소프트웨어의 설치 없이 대부분의 운영체제에 포함된 웹 브라우저만으로 서비스를 제공할 수 있다는 장점이 있다.


출저: https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%84%9C%EB%B2%84





"Web server"는 하드웨어, 소프트웨어 혹은 두 개 모두를 의미할 수 있습니다. 

  1. 하드웨어 측면에서, web server는 website의 컴포넌트 파일들을 저장하는 컴퓨터입니다. ( 컴포넌트 파일에는 HTML 문서, images, CSS stylesheets,, 그리고 JavaScript files가 있습니다.) 그리고 이 파일들을 최종 소비자의 디바이스에 전달합니다. web server는 인터넷에 연결되어 있고, mozilla.org와 같은 domain name을 통해 접속될 수 있습니다.
  2. 소프트웨어 측면에서, web server는 최소한으로 HTTP server에서 어덯게 웹 사용자가 호스트 파일들을 접근하는지를 관리하는 여러 부분을 포함합니다. HTTP 서버는 URL(Web addresses)과 HTTP(당신의 브라우자거 웹 페이지를 보여주기 위해 사용하는 프로토콜)의 소프트웨어 일부입니다.

가장 기본적인 단계에서, 브라우저가 웹 서버에서 불려진 파일을 필요로 할때, 브라우저는 HTTP를 통해 파일을 요청합니다. 요청이 올바른 웹 서버(하드웨어)에 도달하였을 때, HTTP 서버(software)는 요청된 문서를 HTTP를 이용해 보내줍니다. 

Basic representation of a client/server connection through HTTP

웹 사이트를 공개하기 위해서는, 당신은 정적 혹은 동적 웹 서버가 필요합니다.

정적 웹 서버 혹은 스택은 HTTP 서버 (소프트웨어)가 있는 컴퓨터(하드웨어)로 구성되어 있습니다. 서버가 그 불려진 파일을 당신의 브라우저에게 전송하기 때문에, 저희는 그것을 "정적"이라고 부릅니다.

동적 웹 서버는 정적 웹 서버와 추가적인 소프트웨어(대부분 일반적인 애플리케이션 서버와 데이터베이스)로 구성되어 있습니다. 애플리케이션 서버가 HTTP 서버를 통해 당신의 브라우저에게 불려진 파일들을 전송하기 전에, 애플리케이션 서버가 업데이트하기 때문에 우리는 이것을 동적이라고 부릅니다.

예를 들어, 당신이 브라우저에서 보는 최종 웹페이지들을 생성하기 위해, 애플리케이션 서버는 아마 데이터베이스로 온 컨텐츠들로 이루어진 HTML 템플릿을 채울지 모릅니다. MDN 혹은 Wikipedia와 같은 사이트들은 수 천개의 웹페이지들을 가지고 있지만, 그것들은 실제의 HTML 문서가 아니라 오직 약간의 HTML 템플릿과 엄청 큰 데이터베이스로 되어있습니다. 이 구성은 내용들을 전달하고 관리하기 쉽고 빠르게 만들어 줍니다.

출저: https://developer.mozilla.org/ko/docs/Learn/Common_questions/What_is_a_web_server



was구조


http://sungbine.github.io/tech/post/2015/02/15/tomcat%EA%B3%BC%20apache%EC%9D%98%20%EC%97%B0%EB%8F%99.html





웹 서버 (Web Server)란?


인터넷 상에서 웹 브라우저 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지들을 보내주는 역할을 하는 프로그램입니다. 간단히 말하면 HTTP 요청에 따라 서버에 저장되어 있는 적절한 웹페이지를 클라이언트에게 전달하는 것입니다. 웹 페이지 뿐만 아니라 그림, 스타일 시트, 자바스크립트도 해당합니다. 


주로 서버에 있는 리소스를 전달하는게 주된 기능이기도 하지만, 클라이언트로부터 콘텐츠를 받는 것도 웹 서버 기능에 포함합니다.



 애플리케이션 서버 (Web Application Server/WAS)란?


인터넷 상에서 HTTP를 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해 주는 미들웨어라고 합니다. 단순하게 WAS라고도 합니다. Servlet, ASP, JSP, PHP 등의 웹 언어로 작성된 웹 애플리케이션을 서버단에서 실행된 후 실행 결과값을 사용자에게 넘겨주게 되고, 우리가 가진 브라우져가 결과를 해석해서 화면에 표시하는 순으로 동작을 합니다.


웹 애플리케이션 서버는 다음과 같은 3가지 기본 기능을 가지고 있습니다. 

  - 프로그램 실행 환경과 데이터베이스 접속 기능을 제공

  - 여러 개의 트랜잭션을 관리

  - 업무를 처리하는 비즈니스 로직 수행



출저: http://bsnippet.tistory.com/47

25. .NET 환경에서 ASP.NET으로 웹 애플리케이션을 개발하는 두 가지 기술과 각각의 특징을 적으시오.

In My Point
웹 API?
웹페이지 and MVC 모델?
웹 페이지 같은 경우 처음부터 끝까지 다 책임지고 DB, 서버, 웹페이지 이렇게 다 구성하는 것

웹 API의 경우 DB, 서버 까지 책임짐 웹 페이지는 여러개로 다른사람이 구현할 수 있음 요즘 트렌드임 ajax로 주로 만듬 angular, react, vue 이런 프레임워크가 있음 빠르게 개발할 수 있어 생산성이 높음 그러나 큰 서비스에는 상대적으로 부적합할 수 있음 왜냐하면 웹 에이피아이로부터 데이터를 제공 받는데 그 정보를 가공하는 것이 프론트 단이라서 많은 데이터를 받게 되면 느려질 수 있음 그럼에도 불구하고 생산성 때문에 앞으로 유력한 개발 기술 closer, scope chain, callback





26. MVC 패턴에서 컨트롤러, 뷰, 모델의 역할을 설명하시오.

In My Point
Model View Controller 이렇게 분류하여 웹 브라우저를 구성한다.
Model의 경우 DB와 연결을 역할 
View는 보이는 것에만 역할
Controller는 Model과 View를 이어주는 역할
데이터베이스가 들어가니까 동적 페이지를 보여주는데 탁월함 왜 이렇게 하냐면 유지보수가 쉬우니까 모델은 디비연결만 신경쓰면 되고 뷰는 프론트 페이지 신경쓰면 되고 컨트롤러는 비지니스 로직만 신경쓰면 된다. view는 html, css, javascript 부분인데 자바스크립트도 동적역할을 보여 줄수 있지만 그건 생략하고, html이 골격을 짜고 css가 이쁘게, javascript가 약간의 동적인 역할 해주면 됨
컨트롤러 같은 경우 서버로부터 나오는 정보를 페이지에 뿌려주도록 하며 웹페이지에서 전송된 정보들을 디비로 가공 or direct로 전달 비지니스 로직에 따라 전달하게 됨 모델 부분은 db커넥션 클로즈 이쪽 담당





Web과 MVC

위의 개념을 웹에 적용해보자. 

  1. 사용자가 웹사이트에 접속한다. (Uses)
  2. Controller는 사용자가 요청한 웹페이지를 서비스 하기 위해서 모델을 호출한다. (Manipulates)
  3. 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후에 그 결과를 리턴한다.
  4. Controller는 Model이 리턴한 결과를 View에 반영한다. (Updates)
  5. 데이터가 반영된 VIew는 사용자에게 보여진다. (Sees)

CodeIgniter와 MVC

Controller

사용자가 접근 한 URL에 따라서 사용자의 요청사항을 파악한 후에 그 요청에 맞는 데이터를 Model에 의뢰하고, 데이터를 View에 반영해서 사용자에게 알려준다. 

Model

일반적으로 CI의 모델은 데이터베이스 테이블에 대응된다. 이를테면 Topic이라는 테이블은 topic_model이라는 Model을 만든다. 그런데 이 관계가 강제적이지 않기 때문에 규칙을 일관성 있게 정의하는 것이 필요하다.

View

View는 클라이언트 측 기술인 html/css/javascript들을 모아둔 컨테이너이다. 


출저: https://opentutorials.org/course/697/3828




모델(Model)


데이터를 가진 객체를 모델이라 지칭한다.  데이터는 내부에 상태에 대한 정보를 가질 수도 있고, 모델을 표현하는 이름 속성으로 가질 수 있다.

 

모델은 다음 규칙을 가지고 있음을 이해해야 한다.

1) 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야만 한다.

즉, 화면에 네모 박스 안에 글자가 표현 된다면, 네모 박스의 화면 위치 정보, 네모 박스의 크기 정보, 글자 내용, 글자의 위치, 글자의 포멧 정보 등을 가지고 있어야 한다.

 

2) 뷰(View)나 컨트롤러(Controller)에 대해서 어떤 정보도 알지 말이야 한다.

 데이터 변경이 일어 났을때, 모델에서 화면 UI(View)를 직접 조정해서 수정할 수 있도록 뷰를 참조하는 내부 속성값을 가지면 안된다는 말이다.

 

3) 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야만 한다.

모델의 속성 중 텍스트 정보가 변경되면, 이벤트를 발생시켜 누군가에게 전달해야 하며, 누군가 모델을 변경하도록 요청하는 이벤트를 보냈을때 이를 수신할 수 있는 처리 방법을 구현해야 한다. 이는 모델이 변경되는 방법을 다른 구성 요소들에게 알려주게 되는 방법이다.

 

 

뷰 (View)


화면에 표시되는 글자, 체크박스, 윈도우와 같은 UI라는 시각적 요소를 지칭한다.

 

뷰에서도 다음 규칙을 이해하고, 사용해야 한다.

1) 모델이 가지고 있는 정보를 따로 저장해서는 안된다.

화면에 글자를 표시 하기 위해, 모델 정보를 전달 받게 될텐데, 그 정보를 유지 하기 위해서 임의로 뷰 내부에 저장하면 안된다는 말이다. 단순히 네모 박스를 그리라는 명령을 받으면, 화면에 표시하기만 하고, 그 화면을 그릴때 필요한 정보들은 저장하지 않는 다는 것이다.

 

2) 모델이나 컨트롤러과 같이 다른 구성 요소를 몰라야 된다.

모델과 같이 자기 자신의 빼고는 다른 요소는 참조하거나 어떻게 동작하는지 알아서는 안된다. 그냥 뷰는 데이터를 받으면, 화면에 표시해주는 역할만 가진다고 보면된다. 각자 이기적이라고 보면 된다. '난 화면에만 그리고 그때 쓴 데이터는 쓰레기 통에 버릴꺼야' 하는 이기적인 녀석 말이다.

 

3) 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야만 한다.

모델과 같이 변경이 일어났을때 이에 누군가에게 변경을 알려줘야하는 방법을 구현해야 한다. 뷰에서는 화면에서 사용자가 화면에 표시된 내용을 변경하게 되면 이를 모델에게 전달해서, 모델을 변경해야 할 것이다. 그 작업을 하기 위해 변경 통지를 구현한다.

 

뭐 이쯤 읽었으면 이에 대한 처리 방법을 왜 구현해야 하는지 짐작할 수도 있을것이다. 이는 모델이나 뷰에서 변경이 일어났을때, 이를 컨트럴로에게 알리고, 컨트롤러는 어떻게 처리할지 결정해 다시 다른 구성 요소에서 변경을 알려주는 중재자 같은 역할을 위해 변경 통지 관련 처리 방법을 구현하는 이유이다.

 

 

컨트롤러 (Controller)


모델과 뷰를 연결해 주는 역할을 한다. 주로 비즈니스 로직(문제를 해결하기 위한 과정)이 이 컨트롤러에서 구현되어 있는 것이다. 음식 재료와 음식을 예를 들면, 음식 재료가 있고 이를 조리법을 이용해 음식을 완성한다고 했을때, 음식 재료들은 데이터가 될터이고, 조리법은 컨트롤러, 그리고 완성된 음식은 뷰로 표현할 수도 있을것 같은데... 예를 들고 보니 조금은 부적절하다는 생각도 들지만, 필자의 지식 수준이 여기까지라고 생각하고 글을 읽어주길 바란다.

 

컨트롤러는 다음 규칙을 이해해야 합니다.

1) 모델이나 뷰에 대해서 알고 있어야 한다.

모델이나 뷰는 서로의 존재를 모르고, 변경을 외부로 알리고, 수신하는 방법만 가지고 있는데, 이를 컨트롤러가 중재하기 위해 모델과 그에 관련된 뷰에 대해서 알고 있어야 합니다.

 

2) 모델이나 뷰의 변경을 모니터링 해야 한다.

모델이나 뷰의 변경을 통지 받으면, 이를 해석해서 각각의 구성 요소에게 통지를 해야 하는것입니다.

 

끝맺음

몇 가지 기준을 세우고, MVC 패턴을 이해하고 사용한다면, 왠만한 Framework를 익히는 기초가 될꺼라 생각됩니다. 사실 '좋은 말 한마디가 천금보다 낫다'는 말처럼 개발자에게는 긴 글 보다 한줄의 코드로 이해하기 쉬울 수도 있을텐데....사실 이 글은 스스로에게 알려주는 글이다 보니, 태생적 한계가 존재하게 되었습니다.

 

요즘 기초적인 부분을 정리하면서 드는 생각들은, 수많은 개발 기술들이 세상에 나오고, 활용 되는 것을 보면, 그 내용들은 기초에서 파생되어 발전된 내용이라는 것을 알게됩니다. 기초는 모르고 써도 되지만, 결국 한계에 다다르지요.



출저: http://bsnippet.tistory.com/13



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

C# 004  (0) 2017.03.23
C# 003 (컬랙션, 싱글톤)  (0) 2017.03.22
C# 002  (0) 2017.03.21
[C#] Virtual(가상) vs Abstract(추상) vs Interface(인터페이스)  (0) 2017.03.08
001 C# 이란?  (0) 2017.02.16