CS/λ””μžμΈ νŒ¨ν„΄

[λ””μžμΈ νŒ¨ν„΄] ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„

1eehyunji 2023. 8. 7. 23:21

ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λž€ ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ ν”„λ‘œκ·Έλž˜λ°μ˜ 관점을 κ°–κ²Œ ν•΄μ£ΌλŠ” 역할을 ν•˜λŠ” 개발 방법둠이닀.

예λ₯Ό λ“€μ–΄, 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ ν”„λ‘œκ·Έλž¨μ„ μƒν˜Έ μž‘μš©ν•˜λŠ” κ°μ²΄λ“€μ˜ μ§‘ν•©μœΌλ‘œ λ³Ό 수 있게 ν•˜λŠ” λ°˜λ©΄μ—,

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μƒνƒœ 값을 μ§€λ‹ˆμ§€ μ•Šμ€ ν•¨μˆ˜ κ°’λ“€μ˜ μ—°μ†μœΌλ‘œ λ³Ό 수 있게 ν•œλ‹€.

ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ€ 크게 μ„ μ–Έν˜•κ³Ό λͺ…λ Ήν˜•μœΌλ‘œ λ‚˜λ‰˜κ³ , μ„ μ–Έν˜•μ€ ν•¨μˆ˜ν˜•μ΄λΌλŠ” ν•˜μœ„ κ°œλ…μ„ κ°€μ§€λ©°, λͺ…λ Ήν˜•μ€ 객체 μ§€ν–₯ν˜•κ³Ό 절차 μ§€ν–₯ν˜•μœΌλ‘œ λ‚˜λ‰œλ‹€.

 

μ„ μ–Έν˜•κ³Ό ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°(declarative programming)은 '무엇을' ν’€μ–΄λ‚΄λŠ”κ°€μ— μ§‘μ€‘ν•˜λŠ” νŒ¨λŸ¬λ‹€μž„μ΄λ‹€. 예λ₯Ό λ“€μ–΄, 화면에 μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‚˜νƒ€λ‚΄μ•Ό ν•  λ•Œ, "μ–΄λ–€ 방법"으둜 νŽ˜μ΄μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ”μ§€μ— μ§‘μ€‘ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 제λͺ©, λ³Έλ¬Έ, 이미지 λ“± "무엇을" νŽ˜μ΄μ§€μ— λ‚˜νƒ€λ‚Όμ§€ μ§‘μ€‘ν•˜λŠ” 것이닀.

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ 일쒅이닀. 

예λ₯Ό 듀어보면 λ‹€μŒκ³Ό κ°™λ‹€.

const list = [1,2,3,4,5,11,12]
const ret = list.reduce((max, num) => num > max? num : max, 0)
console.log(ret) //12

*reduce() ν•¨μˆ˜λŠ” 'λ°°μ—΄'만 λ°›μ•„μ„œ λˆ„μ ν•œ 결과값을 λ°˜ν™˜ν•˜λŠ” μˆœμˆ˜ν•¨μˆ˜μ΄λ‹€.

reduce ν•¨μˆ˜μ˜ μ‚¬μš© 방법은 μ•„λž˜ λΈ”λ‘œκ·Έμ—μ„œ 보고 μ΄ν•΄ν–ˆλ‹€!

https://velog.io/@teo_ryu/javascript-reduce-%ED%95%A8%EC%88%98%EC%99%80-%EC%8B%B8%EC%9A%B0%EA%B8%B0

 

[javascript] reduce ν•¨μˆ˜μ™€ μ‹Έμš°κΈ°

ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ³  ν•˜λ‚˜μ˜ 결과값을 λ°˜ν™˜ν•˜λŠ” reduce. μ–΄λ–»κ²Œ 생겨먹은 거냐

velog.io

μš°μ„  max 값에 initial κ°’μœΌλ‘œ 0이 λ“€μ–΄κ°„λ‹€. 그리고 κ·Έ 후에 list의 μš”μ†Œλ“€μ΄ μ°¨λ‘€λŒ€λ‘œ num으둜 λ“€μ–΄μ˜€λ©΄μ„œ list의 μ΅œλŒ€κ°’μ„ κ΅¬ν•˜λŠ” 것이닀.

num > max κ°€ true이면 max에 num이 μ €μž₯되고, false이면 maxκ°€ μ €μž₯λœλ‹€.

λͺ¨λ“  list μš”μ†Œλ₯Ό 거치고 λ‚˜λ©΄ μ΅œμ’… 결과값이 ret에 μ €μž₯되고, 12κ°€ 좜λ ₯λœλ‹€.

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μ΄λŸ¬ν•œ '순수 ν•¨μˆ˜'듀을 λΈ”λ‘μ²˜λŸΌ μŒ“μ•„μ„œ λ‘œμ§μ„ κ΅¬ν˜„ν•˜κ³  'κ³ μ°¨ ν•¨μˆ˜'λ₯Ό 톡해 μž¬μ‚¬μš©μ„±μ„ 높인 ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λ‹€.

 

μ—¬κΈ°μ„œ 순수 ν•¨μˆ˜, κ³ μ°¨ ν•¨μˆ˜μ— λŒ€ν•œ κ°œλ… 정리가 ν•„μš”ν•˜λ‹€κ³  μƒκ°ν–ˆλ‹€.

순수 ν•¨μˆ˜

const pure = (a,b) => {
	return a+b
}

좜λ ₯이 μž…λ ₯μ—λ§Œ μ˜μ‘΄ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. μœ„ ν•¨μˆ˜μ—μ„  λ§€κ°œλ³€μˆ˜ a, bμ—λ§Œ 영ν–₯을 λ°›λŠ”λ‹€. λ§Œμ•½ a, b 말고 λ‹€λ₯Έ μ „μ—­ λ³€μˆ˜ c 등이 이 좜λ ₯에 영ν–₯을 μ£Όλ©΄ 순수 ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€.

 

κ³ μ°¨ ν•¨μˆ˜

ν•¨μˆ˜λ₯Ό 맀개 λ³€μˆ˜λ‘œ μž…λ ₯을 λ°›κ±°λ‚˜ 리턴 κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜. (ν•¨μˆ˜λ₯Ό μ–΄λ–€ κ°’μ²˜λŸΌ μ‚¬μš©ν•œλ‹€.)

// ν•¨μˆ˜λ₯Ό 인자둜 전달
function sayHello() {
  return "Hello, ";
}
function greeting(helloMessage, name) {
  console.log(helloMessage() + name);
}
// `sayHello`λ₯Ό `greeting` ν•¨μˆ˜μ— 인자둜 전달
greeting(sayHello, "JavaScript!");

// 리턴 κ°’μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©
function sayHello() {
   return function() {
      console.log("Hello!");
   }
}

μ΄λŸ¬ν•œ κ³ μ°¨ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή μ–Έμ–΄κ°€ ν•¨μˆ˜λ₯Ό 일급 객체둜 μ‚¬μš©ν•œλ‹€λŠ” νŠΉμ§•μ„ κ°€μ Έμ•Ό ν•œλ‹€.

일급 객체둜 여겨지기 μœ„ν•΄μ„  λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°€μ Έμ•Ό ν•œλ‹€.

  • ν•¨μˆ˜μ— λ§€κ°œλ³€μˆ˜λ‘œ λ‹΄κΈΈ 수 있음.
  • ν•¨μˆ˜μ˜ 리턴 κ°’μœΌλ‘œ μ‚¬μš©ν•  수 있음.
  • λ³€μˆ˜μ— ν• λ‹Ήλ˜κ±°λ‚˜ λ©”μ„œλ“œλ‘œ μ‚¬μš©ν•  수 있음.

*λ©”μ„œλ“œμ™€ ν•¨μˆ˜μ˜ μ°¨μ΄λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 객체가 μžˆλŠ” 경우 λ©”μ„œλ“œλΌκ³  λ§ν•˜λ©°, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 객체가 μ—†λŠ” 경우 ν•¨μˆ˜λΌκ³  λ§ν•œλ‹€.

 

λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž¨μ΄λž€ κ°μ²΄λ“€μ˜ μ§‘ν•©μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μƒν˜Έ μž‘μš©μ„ ν‘œν˜„ν•˜λ©° 데이터λ₯Ό 객체둜 μ·¨κΈ‰ν•˜μ—¬ 객체 내뢀에 μ„ μ–Έλœ λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•˜λŠ” 방식을 λ§ν•œλ‹€. 

예λ₯Ό λ“€μ–΄, μžμ—°μˆ˜λ‘œ 이루어진 λ°°μ—΄μ—μ„œ μ΅œλŒ€κ°’μ„ 찾으라고 ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 λ‘œμ§μ„ κ΅¬μ„±ν•œλ‹€.

const ret = [1,2,3,4,5,11,12]
class List {
	contructor(list){
    	this.list = list
        this.mx = list.reduce((max, num) => num > max ? num : max, 0)
    }
    getMax() {
    	return this.mx
    }
}

const a = new List(ret)
console.log(a.getMax()) //12

λ³€μˆ˜ a에 클래슀 List의 객체λ₯Ό μƒμ„±ν•˜λŠ”λ°, 이 κ³Όμ •μ—μ„œ 클래슀 List의 μƒμ„±μžλ₯Ό μ‹€ν–‰ν•˜κ³ , λ§€κ°œλ³€μˆ˜μΈ ret의 μ΅œλŒ€κ°’μ„ 클래슀 List의 mx λ³€μˆ˜μ— μ €μž₯ν•œλ‹€.

그리고 클래슀 List의 객체가 μ €μž₯된 aμ—μ„œ getMax() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ ret의 μ΅œλŒ€κ°’μ„ 좜λ ₯ν•œλ‹€.

 

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•

  • 좔상화
    • λ³΅μž‘ν•œ μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° 각 κ°μ²΄λ“€μ˜ 곡톡적인 κ°œλ… λ˜λŠ” κΈ°λŠ₯을 κ°„μΆ”λ¦¬λŠ” 것이닀.
    • 예λ₯Ό λ“€μ–΄, μžλ™μ°¨μ™€ μ˜€ν† λ°”μ΄λŠ” λͺ¨λ‘ 이동 μˆ˜λ‹¨μ΄λ©΄μ„œ, μ „μ§„κ³Ό 후진이 κ°€λŠ₯ν•˜λ‹€λŠ” 곡톡점이 μžˆλ‹€.
    • μ΄λŸ¬ν•œ 경우 '이동 μˆ˜λ‹¨'μ΄λΌλŠ” μƒμœ„ ν΄λž˜μŠ€μ— 'μžλ™μ°¨'와 'μ˜€ν† λ°”μ΄'λΌλŠ” ν•˜μœ„ 클래슀λ₯Ό 두고, 이동 μˆ˜λ‹¨ ν΄λž˜μŠ€μ— ν•˜μœ„ ν΄λž˜μŠ€λ“€μ˜ 곡톡적인 κΈ°λŠ₯(μ „μ§„, ν›„μ§„)와 속성듀을 μ •μ˜ν•˜λŠ” 것이닀.
  • μΊ‘μŠν™”
    • 객체의 속성과 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ‘œ λ¬Άκ³  일뢀λ₯Ό 외뢀에 κ°μΆ”μ–΄μ„œ μ€λ‹‰ν•˜λŠ” 것이닀.
  • 상속성
    • μƒμœ„ 클래슀의 νŠΉμ„±μ„ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ΄μ–΄λ°›μ•„μ„œ μž¬μ‚¬μš©ν•˜κ±°λ‚˜ μΆ”κ°€, ν™•μž₯ν•˜λŠ” 것을 λ§ν•œλ‹€. 
  • λ‹€ν˜•μ„±
    • ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ‚˜ ν΄λž˜μŠ€κ°€ λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ λ™μž‘ν•˜λŠ” 것을 λ§ν•œλ‹€. λŒ€ν‘œμ μœΌλ‘œ μ˜€λ²„ λ‘œλ”©κ³Ό μ˜€λ²„ 라이딩이 μžˆλ‹€. 
    • μ˜€λ²„ λ‘œλ”©
      • 같은 이름을 κ°€μ§„ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ λ‘λŠ” 것을 λ§ν•œλ‹€. λ©”μ„œλ“œμ˜ νƒ€μž…, 맀개 λ³€μˆ˜μ˜ μœ ν˜•κ³Ό 개수 λ“±μœΌλ‘œ μ—¬λŸ¬ 개λ₯Ό λ‘˜ 수 μžˆλ‹€.
      • μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€. 
Class Person {
	public void eat(String a) {
    	System.out.println("I eat" + a);
    }
    
    public void eat(String a, String b) {
    	System.out.println("I eat" + a + "and" +b);
    }
}

public class CalculateArea {
	
    public static void main(String[] args) {
    	Person a = new Person();
        a.eat("apple");
        a.eat("tomato", "phodo");
    }
}

/*
I eat apple
I eat tomato and phodo
*/

Person 클래슀의 객체 aκ°€ eat ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ, λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ— 따라 λ‹€λ₯Έ eat ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 것을 확인할 수 μžˆλ‹€.

  • μ˜€λ²„λΌμ΄λ”©
    • μƒμœ„ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ†Œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€κ°€ μž¬μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.
    • μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.
Class Animal {
	public void bark() {
    	System.out.println("mumu! mumu!");
    }
}

Class Dog extends Animal {
	@override
    public void bark() {
    	System.out.println("wal!! wal!!")
    }
}

public class Main {
	public static void main(String[] args) {
    	Dog d = new Dog();
        d.bark();
    }
}

/*
wal!! wal!!
*/

Animal 클래슀λ₯Ό 상속받은 Dog ν΄λž˜μŠ€μ—μ„œ μƒμœ„ 클래슀의 bark() ν•¨μˆ˜λ₯Ό μ˜€λ²„λΌμ΄λ”©(μž¬μ •μ˜)ν•˜μ—¬ λ©”μΈμ—μ„œ Dog 클래슀의 bark() ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ "wal!! wal!!"이 좜λ ₯λœλ‹€.

 

μ ˆμ°¨ν˜• ν”„λ‘œκ·Έλž˜λ°

μ ˆμ°¨ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 둜직이 μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  연속적인 계산 κ³Όμ •μœΌλ‘œ 이루어져 μžˆλ‹€. 일이 μ§„ν–‰λ˜λŠ” λ°©μ‹μœΌλ‘œ κ·Έμ € μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κΈ°λ§Œ ν•˜λ©΄ 되기 λ•Œλ¬Έμ— μ½”λ“œμ˜ 가독성이 μ’‹μœΌλ©° μ‹€ν–‰ 속도가 λΉ λ₯΄λ‹€. κ·Έλž˜μ„œ 계산이 λ§Žμ€ μž‘μ—…μ— 주둜 쓰인닀. 

ν•˜μ§€λ§Œ, λͺ¨λ“ˆν™”ν•˜κΈ°κ°€ μ–΄λ ΅κ³  μœ μ§€ λ³΄μˆ˜μ„±μ΄ λ–¨μ–΄μ§„λ‹€. 

예λ₯Ό λ“€μ–΄ μžμ—°μˆ˜λ‘œ 이루어진 λ°°μ—΄μ—μ„œ μ΅œλŒ“κ°’μ„ 찾으라고 ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 λ‘œμ§μ„ κ΅¬μ„±ν•œλ‹€.

const ret = [1,2,3,4,5,11,12]
let a = 0
for (let i = 0l i < ret.length; i++){
	a = Math.max(ret[i],a);
}
console.log(a) //12

μ½”λ“œκ°€ μž‘μ„±λœ μˆœμ„œλŒ€λ‘œ ret λ°°μ—΄κ³Ό a λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³ , for λ°˜λ³΅λ¬Έμ„ μ΄μš©ν•΄μ„œ ret λ°°μ—΄μ˜ μ΅œλŒ€κ°’μ„ μ°Ύμ•„μ„œ a에 μ €μž₯ν•˜κ³  좜λ ₯ν•œλ‹€.