인터페이스는 코스 메뉴에서 필요한 것만 고를 수 있게 하는 느낌인건가
오리라는 상위 클래스에서 날기를 추가했더니 고무 오리도 날게 되는 현상을 방지하기 위해
인터페이스를 사용하는 방식은 코드 재사용이 불가능하니까 최악의 해결책이라고 책에선 말하는데
이래서 어제 찾아봤던 인터페이스 default implementation을 가능하게 만든거구나
소프트웨어 개발에서 무엇을 얼마나 잘 만들었든 시간이 지남에 따라 변화하고 성장해야 한다
디자인 원칙 1
애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다.
-> 요구 사항은 항상 달라지기 때문에 '달라지지 않는 부분'이라는걸 정할 수 없으니까 프로그램이 항상 변화하는 건가
바뀌는 부분은 따로 뽑아서 캡슐화한다. 그러면 나중에 바뀌지 않는 부분에는 영향을 미치지 않고 그 부분만 고치거나 확장할 수 있다.
디자인 원칙 2
구현보다는 인터페이스에 맞춰서 프로그래밍한다
오리 클래스가 아니라 각 행동을 인터페이스로 만들어서 구현
인터페이스라고 해서 꼭 인터페이스를 쓰라는 건 아니고 "상위 형식에 맞춰서 프로그래밍하라"는 거
인터페이스 아래에 구체적인 행동을 구현하는 클래스들 놓는다
예를 들어 FlyBehaviour에 fly()를 쓰고 그 아래에 FlyWithWings 클래스, FlyNoWay 클래스를 구현하면
다른 형식의 객체에서도 나는 행동을 재사용할 수 있고
기존 행동 클래스를 수정하거나 날아다니는 행동을 사용하는 Duck 클래스를 전혀 건드리지 않고도 새로운 행동을 추가할 수 있음
결국 개념을 쪼개서 선언해놓으라는 거인듯
꽥꽥거리는 행동을 하고 싶을 땐 quackBehaviour에 의해 참조되는 객체에서 꽥꽥거리도록 하면 된다.
public abstract class Duck
{
QuackBehaviour quackBehaviour;
public void performQuack() {
quackBehaviour.quack();
}
}
quackBehaviour에 변수만 넣으면 각기 다른 quack()을 하게 할 수 있음
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehaviour = new Quack();
}
}
이런 식으 QuackBehaviour 인터페이스 아래에 있는 Quack() 클래스를 변수에 넣어주고
performQuack()을 해주면 Quack, Squeack, MuteQuack 중 Quack를 한다.
책에 내용이 자바 기반으로 쓰여 있어서 일단 따라해보려고 했는데
클래스가 뭔지 인터페이스가 뭔지를 모르니까 내가 뭘 하고 있는지 이해가 안됨
일단 C#으로 클래스랑 인터페이스 공부하고 오는게 나을듯
using System;
class SwitchExpression
{
static void Main()
{
Console.WriteLine("정수를 입력");
int answer = Convert.ToInt32(Console.ReadLine());
switch (answer)
{
case 1:
Console.WriteLine("1입니다.");
break;
case 2:
Console.WriteLine("2입니다.");
break;
}
}
}
class SwitchExpression
{
static void Main()
{
Console.WriteLine("오늘 날씨는 :");
string weather = Console.ReadLine();
switch (weather)
{
case "맑음":
Console.WriteLine("오늘 날씨는 맑구나");
break;
case "눈":
Console.WriteLine("오늘은 눈이 내리는구나");
break;
}
}
}
c는 숫자만 됐던 걸로 기억하는데
c#은 문자열도 그냥 switch 문 해주네
(근데 WriteLine을 WirteLine으로 잘못 쓴 거 vscode에서 자꾸 못 잡아줌.
omnisharp라는거 키라는데 그런 설정 없는디; 그냥 마음 편하게 visual studio로 하기로.)
static void Main()
{
for (int i=0; i<5; i++)
{
for (int j=0; j<i; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
}
너무 많이 했던 거라 대충 넘어감
do
{
실행문;
} while (조건식);
문장을 한 번 실행 후 조건을 따진다
static void Main()
{
string str = "ABC123";
foreach(char c in str)
{
Console.WriteLine($"{c}\t");
}
Console.WriteLine();
}
python에선 for 항목 in 항목들:만 해도 되는데
새삼 문득 숭배
static void Main()
{
Console.WriteLine("시작");
Start:
Console.WriteLine("1,2,3 중 하나 입력 : _\b");
int chapter = Convert.ToInt32(Console.ReadLine());
if (chapter == 1)
{
goto Chapter1;
}
else if (chapter == 2)
{
goto Chapter2;
}
else
{
goto End;
}
Chapter1:
Console.WriteLine("1장입니다.");
Chapter2:
Console.WriteLine("2장입니다.");
goto Start;
End:
Console.WriteLine("종료");
}
goto는 잘못 안 쓰면 코드를 망친다고 주워 들었었음
절차지향 언어밖에 없던 시대에 어떻게든 프로그램을 동작시키도록 노력한 느낌
특수한 상황이 아니면 객체 지향 언어로 굳이 goto를 쓸 상황 없지 않을까?