[IT 개발자 면접 대비문제] 오버로딩과 오버라이딩


1.     메소드 오버로딩과 오버라이딩

자바에서 다형성을 지원하는 방법으로 OVERLOADING OVERRIDING이 있다.

 

-오버로딩

같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는기술

메소드 오버로딩과 생성자 오버로딩이 있다. 그러나 둘다 같은 개념이다.

같은이름의 함수를 여러 개 정의하고, 매개변수의 유형과 개수를 다르게하여

다양한 유형의 호출에 응답하게 하는것이다.

 

-오버라이딩

상위 클래스가 가지고 있는 메소드를 상속 받을 때 자식 클래스에서 메소드를 재 정의하는것을 말한다.


소스코드를 보고 확인하자.



반응형

[디자인패턴] STRATEGY(전략패턴) 

 

안녕하세요. 예지우랑입니다.

디자인패턴중 제일 처음에 나오는 STRATEGY(전략)패턴에 대해 알아보겠습니다.

(※ 이 포스팅의 내용과 예제는 한빛미디어의 HEAD FIRST DESIGN PATTERNS를 참조하여 작성하였습니다.)

 

1. STRATEGY PATTEN 

 

-정의 : 알고리즘군을 정의하고 각각을 캡슐화하여 교환하여 사용할 수 있도록한다.

-장점 : 전략패턴을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

 

2. 예제

※예제를 통하여 전략패턴에 대해 알아보도록 하겠습니다.

 

-연못의 오리를 보여주는 프로그램이 있습니다.

  우리는 객체지향의 장점을 활용하기 위하여 'Duck'이라는 SuperClass를 만들어놓고 오리 객체를 만들어서 

 화면에 보여주고있습니다.

 

 

 

 

그림1. Duck SuperClass와 그 클래스를 상속받는 오리 클래스

 

그림1과 같은 구조로 Duck이라는 SuperClass를 선언하여 오리의 기본적인 기능을 정의 해놓고

 자식클래스를 이용하여 변경부분을 조정하여 오리들을 만들고 있습니다.

그런데 이때 우리의 클라이언트가 오리가 날수있게 만들어달라고했습니다.

그래서 아래와 같이 Duck클래스를 수정했죠


그림2. fly 매소드를 추가한 Duck 클래스와 그 클래스를 상속받는 기타 오리 클래스들

 

우리는 아주 쉽게 문제를 해결한거같이 보였지만, 클라이언트는 '고무오리'를 추가해달란 요청을 했습니다.

여기서 문제가 발생하게 되죠




그림3. 고무오리 클래스가 추가된 Class Diagram

 고무오리를 그대로 추가했더니 고무오리가 갑자기 일바오리처럼 '꽥꽥'소리를 내면서 '날기'시작했습니다.

 고무오리가 난다는것은 말도안되며, 일반적으로 고무오리는 '삑삑'소릴르 내기때문에  오버라이드를 통해서 해결했습니다.

 


그림4. 고무오리와 나무오리 클래스

새로 추가된 나무오리도 오버라이드를 통해서 날아다니거나 이상한 소리를 내는것을 막았습니다.

그런데 이런 오리가 추가될때마다 우리가 일일이 오버라이드를 해야한다면 과연 '객체지향'의 이득을 잘 살린 코드라고 할 수 있을까요?

수정사항이 발생하면 코드를 일일이 수정하여야하고, 새로운 오리가 추가될때만다 많은 코딩을 하는것은 바람직하지 않아보입니다.

그래서 Interface를 사용하기로 결정했습니다.



그림5. 인터페이스를 사용한 오리시스템

모든 Duck클래스의 서브클래스 오리들이 날거나, 울거나 하는것은 아니기때문엔 인터페이스로 빼내서 활용하기로했습니다.

이렇게 했을때 일부문제(고무오리, 나무오리가 날아다니거나하는 이상한일)를 해결할 수는 있지만

모든 클래스들에서 인터페이스는 구현해줘야하기때문에 오히려 복잡해지게 됩니다.

따라서 이방법을 사용하느니 차라리 오버라이드를 해주는 방법이 좋을거같습니다.

여기서 디자인 패턴의 원칙이 하나 나옵니다.

 

 

 디자인 원칙!

 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다.

  현재 우리의 오리 프로그램에서 달라지는 부분은 fly() 와 quack()입니다.

 따라서 우리는 해당 메소드를 추출하여 각각의 행동을나타내는 클래스 집합으로 만들것입니다.

 



그림6. Duck 클래스에서 추출한 Fly 클래스와 그를 이용해 새로 만든 Duck클래스

 

위의 Diagram을 보시면 Duck클래스에서 바뀌는 부분들을 뽑아 냈습니다.

Fly 와 , Quack이죠 대표적으로 Fly를 Flayable이라는 인터페이스를 상속시켜 각각 나는 방법을 구현했습니다.

그결과 날개로 나는 FlyWithWings클래스와 날지않는 FlyNoWay클래스가 만들어졌죠,

그리고 만들어진Duck은 그림 7,8과 함께 설명 해 드리겠습니다.

 

 

그림7. 바뀌는 부분을 추출한 QuackBehavior와 FlyBehavior인터페이스

 

각각 인터페이스를 이용하여 그것을 상송항 클래스를 구현했는데요 여기에서 또다시 디자인 원칙이 나옵니다.

 

 

 디자인 원칙!

 구현이 아닌 인터페이스에 맞춰서프로그래밍한다.

  인터페이스에 맞춰서 프로그래밍 한다는것은 상위 형식에 맞춰서 프로그래밍 한다는 것을 뜻합니다.

여기서 인터페이스는 중의적으로 쓰였는데, 자바의 INTERFACE구조를 지지항기도하고, 상위형식에 맞춰 프로그래밍을 하여

다형성을 화용해야한다는것입니다.

객체를 변수에대입할때 상위형식을 구체적으로 구현한 형식이라면 어떠한 클래스에도 집어넣을 수 있고, 선언하는 클래스에서 실제 객체의 형식을 몰라도 되기때문입니다. 




그림8. Animal인터페이스를 이용한 Dog클래스와 Cat클래스

 

여기서 구현에 맞춰 프로그래밍하는것과 인터페이스에 맞춰서 프로그래밍 하는것을 알아봅시다.

 

Dog d = new Dog();

d.bark();

 

위의 코드는 구현에 맞춰서 프로그래밍 한것입니다.

d는 Dog클래스를 선언한것으로 구체적 구현에 마ㅈ춰져 코딩한것입니다.

 

Animal animal = new Dog();

animal.makeSound();

 

위의 코드는 인터페이스에 맞춰서 프로그래밍 한 것입니다.

'다형성'덕분에 상위 클래스에 해당하는 변수는 하위 클래스 객체를 담을 수 있습니다.

 

이렇게 인터페이스에 맞춰서 프로그래밍을 한다면 사용을할때 해당 변수에 적절한 객체(클래스)를 

대입하여 사용할 수 있겠죠?

 

이제 다시한번 확인 해 봅시다.

 

그림9. 새로 만든 Duck클래스

 

새로만든 덕 클래스에는 아까 만든 FlyBehavior 인터페이스에 해당하는 변수와 

QuackBehavior 인터페이스에 해당하는 변수가 만들어 졌습니다.

그리고 fly() 메소드와 quack()메소드 대신 performFly()메소드와 performQuack()메소드가 들어있습니다.

두 메소드의 구현을 살펴봅시다.

 

public void performFly() {

  flyBehavior.fly();   

}

 

public void perfromQuack(){

  quackBehavior.quack();

}

 

위의 두 메소드에서는 변수로 가지고있는 클래스의 메소드를 이용하는 클래스를 사용하여

행동을 합니다. 

이렇게하면 Duck클래스는 울거나 날수있지만 그동작이 어떻게 이루어지는지는 전혀 알 필요가없습니다.

이는 자바의 '캡슐화'입니다.

어떻게 동작이 이루어지던지 전혀 상관없고 단지 할 수 있다는것이 중요한 것이죠.

 

 

이제부터는 구현을 한번 해봅시다.

 


















※ quack은 상위클래스(인터페이스)를 , fly는 구체적인 자식클래스를 변수에 담아보기로합니다.


 

최종적으로 시뮬레이터를 통하여 테스트해본결과 원하는 대로 나오게됩니다.

 

 

이번에는 나는 방법을 동적으로 추가해보기로합시다.

 

먼저 덕클래스에 동적으로 지정하기위한 메소드를 추가합니다.

 



모델 덕 클래스를 새로 만듭니다.


로켙을 이용하는 Fly를 클래스를 만듭니다.



시뮬레이션을 수정하여 다시한번 실행 해 봅시다.

 

 

 

 

지금 까지 만들었던 오리 프로그램을 크게 바라봐봅시다.


파란 부분은 클라이언트/ 빨간부분은 오리의 행동을 캡슐화시킨 것들이죠

 

디자인 패턴에서 오리의 행동들은 '알고르즘' 혹은 '로직' 이라고 생각하시면 좋습니다.

우리는 A는 B이다 보다는 A에는 B가 있다 라고 생각을 하는것이 좋습니다.

A에 B가있다라는 관계를 오리 프로그램에서 생각 해 보면 

오리에는 FlyBehavior 와 QuackBehavior가 있으며, 각각 행동들(알고리즘 혹은 로직)을 위임받습니다.

 

두 클래스를 이런식으로 합치는것을 구성(composition)을 이용한다고 합니다.

 

오리클래스에서 생송을 상속받는 대신 올바른 행동 객체로 구성함으로써 행동을 부여받게 됩니다.

 

여기서 또다른 디자인 원칙이 나옵니다.

 

 

 

 디자인 원칙!

 상속보다는 구성을 활용한다.

 구성을 이용하여 만들면 유연성이 크게 향상되며캡슐화를 통하여 유지/보수시에 코드수정을 최소화 할 수 있습니다.

 

 

마지막으로 지금까지 본 스트래지티 패턴(STRATEGY PATTERN)의 정의를 한번 더 말씀드리자면

스트래지티 패턴(STRATEGY PATTERN):

알고리즘군(로직)을 정의하고 각각을 캡슐화하여 교환하여 사용할 수 있도록 만든다. 

이 패턴을 사용하면 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

반응형

'프로그래밍 > 디자인패턴' 카테고리의 다른 글

[디자인패턴] OBSERVERPATTEN(옵저버패턴)  (0) 2014.12.13

[ASP Classic] 형변환


Cint 함수 : integer형으로 변환

사용법 : Cint(변수)

 

 

Clng 함수 : long형으로 변환

사용법 : Clng(변수)

 

 

 

Cstr 함수 : string형으로 변환

사용법 : Cstr(변수)

 

 

 

Cdbl 함수 : double형으로 변환

사용법 : Cdbl(변수)

 

 

 

Csng 함수 : single형으로 변환

사용법 : Csng(변수)

 

 

 

Cdate 함수 : date(날짜)형으로 변환

사용법 : Cdate(변수)


 

Round() 함수 :  반올림 함수

         사용법 : Round(변수)

 

 

Fix() 함수 :  버림 함수

     사용법 : Fix(변수)

반응형

JavaScript] 조건부 연산자 <삼항연산자(?연산자)> 

조건에 따라 두 식 중 하나를 반환합니다.

test ? expression1 : expression2 

 

test

임의의 Boolean 식입니다.

expression1

test is true." xml:space="preserve"><sentencetext xmlns="http://www.w3.org/1999/xhtml">이면 식이 반환된 test 는 true.</sentencetext> 쉼표 식이 될 수 있습니다.

expression2

test is false." xml:space="preserve"><sentencetext xmlns="http://www.w3.org/1999/xhtml">이면 식이 반환된 test 는 false.</sentencetext> 여러 개의 식을 쉼표로 식으로 연결 될 수 있습니다.

?: operator can be used as a shortcut for an if...else statement." xml:space="preserve" style="color: rgb(42, 42, 42); font-family: 'Malgun Gothic', Gulim, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 1.5;"><sentencetext xmlns="http://www.w3.org/1999/xhtml">?: 연산자는 if...else 문의 단축형으로 사용할 수 있으며</sentencetext> if...else statement would be awkward." xml:space="preserve" style="color: rgb(42, 42, 42); font-family: 'Malgun Gothic', Gulim, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 1.5;">일반적으로 if...else 문을 사용하면 너무 복잡해지는 식에서 사용합니다. 예를 들면 다음과 같습니다.

var now = new Date();
var greeting = "Good" + ((now.getHours() > 17) ? " evening." : " day.");

현재 시각이 오후 6시 이후이면 이 예제는 "Good evening."이라는 문자열을 만듭니다.  if...else statement would look as follows:" xml:space="preserve">if...else 문을 사용하여 동일한 기능을 가진 코드를 작성하면 다음과 같습니다.

var now = new Date();
var greeting = "Good";
if (now.getHours() > 17)
   greeting += " evening.";
else    
greeting += " day."; 


반응형

'웹프로그래밍 > JavaScript' 카테고리의 다른 글

[JavaScritpt] var, let, const란  (0) 2017.07.06
[ajax]radio.value udefined오류  (2) 2015.07.31

[ASP Classic] INSTR() 함수

<%

str = "search list"
chk = Instr(str,"list")
Response.Write chk
%>

대상 문자열에서 지정한 문자열이 있으면 몇번째에 있는지 숫자를 반환하고, 없으면 0 을 반환한다.
PHP 의 substr 과 같은 역할을 하는 함수.
주의할점은, 대소문자를 구별하므로, 대소문자가 틀릴경우 0 을 반환하며,
대소문자 구별없이 찾으려면 먼저 UCase 또는 LCase 로 변환한후 비교하여야 한다.



반응형

[ASP Classic] FormatDateTime함수 날짜 형식으로 바꾸기


오늘은 변수의 형식을 날짜형식으로 바꾸는 FormatDateTime 함수에 대해 알아보도록 하겠습니다.


날짜와 시간으로 서식화된 식을 반환한다.

구문 : FormatDateTime(Date[,NamedFormat])

● Date : 필수 요소이다. 서식화할 날짜식을 나타낸다. 
● NamedFormat : 선택 요소이다. 사용되는 날짜/시간 서식을 나타내는 숫자값이다. 이 값을 생략하면 vbGeneralDate가 사용된다.

 

--------------------------------------------------------------------------------------------------- 
상수       값  설명 
vbGeneralDate  0   날짜 및 시간을 표시한다. 날짜 부분이 있으면 간단하게 표시 날짜로 표시한다. 시간 부분이 있으면 자세하게 표시 시간 형식으로 표시한다. 날짜와 시간이 모두 있으면 둘 다 표시된다. 
vbLongDate   1   시스템의 국가별 설정에 지정된 자세하게 표시 날짜 서식을 사용하여 날짜를 표시한다. 
vbShortDate   2   시스템의 국가별 설정에 지정된 간단하게 표시 날짜 서식을 사용하여 날짜를 표시한다. 
vbLongTime   3  시스템의 국가별 설정에 지정된 시간 서식을 사용하여 시간을 표시한다. 
vbShortTime   4  24시간 서식(hh:mm)을 사용하여 시간을 표시한다. 
--------------------------------------------------------------------------------------------------- 



예제.

Dim date_time

date_time = "2014-05-06"

response.write date_time

date_time = FormatDateTime(date_time)

response.write date_time 

date_time = formatDateTime(date_time , 1)

response.write date_time


끝.


....


출력결과


2014-05-06

2014년 7월 23일 수요일

반응형

[jQuery] replace 사용시 팁


010-1234-5678


.replace("-", ""); --> 0101234 - 5678 ( 앞에 한개만 치환됨 )

.replace(/-/g, ""); --> 01012345678  ( 전부 치환됨 )

반응형

'웹프로그래밍 > jQuery' 카테고리의 다른 글

JQuery Select Box 제어  (0) 2015.04.15
jQuery 로 이미지 사이즈 구하기  (0) 2015.04.01

[MSSQL - text, ntext 길이(바이트) 구하기]

컬럼의 데이타 타입이 text 또는 ntext 형일때는 Len() 함수 사용시 다음과 같은 오류가 납니다.

서버: 메시지 8116, 수준 16, 상태 2, 줄 1
len 함수의 1 인수에 대한 인수 데이터 형식 text이(가) 잘못되었습니다.

컬럼의 데이타 타입이 text, ntext 형일때는 DATALENGTH() 함수를 씁니다.

DATALENGTH( expression ): 식을 표시하는 데 사용된 바이트 수를 int 형으로 반환합니다. 괄호안에 expression은 모든 형식의 식을 의미합니다. DataLength() 함수는 가변 길이 데이터를 저장하는 ntext, text, image, nvarchar, varchar, varbinary 등의 데이터 형식에서 유효합니다.

아래의 예제는 Cus_As 테이블의 cus_as 컬럼의 길이가 36byte 보다 크면 substring() 함수를 이용해 36byte 까지 잘라내서 뒤에 ".." 을 붙이고 아니면 cus_as 컬럼의 길이대로 그냥 출력하는 짧은 예제입니다.

SELECT 
CASE WHEN DATALENGTH( cus_as ) > 36 THEN substring(cus_as, 1, 36 ) + '..' ELSE cus_as END as asText 
FROM Cus_As


반응형

[ASP Classic] FormatNumber함수 1000단위 콤마찍기

 

금액을 표현할떄는 1000단위로 콤마를 찍어야 하는 일이 흔합니다.

이럴때 ASP Classic에서 쓸 수 있는 함수가 FormatNumber함수입니다.

 

사용법은 FormatNumber(숫자(혹은 숫자가 들어있는 변수),0(소숫점 몇째자리까지 표현할 것인가)) 입니다.

 

 

EX>

Dim number

number = 100000000

response.write(FormatNumber(number,0))

response.write(FormatNumber(number,2))

response.write(FormatNumber(1000000000,0))

 

 

 

 

 

 

결과

100,000,000

100,000,000.00

1,000,000,000

반응형

+ Recent posts