public class Sample {
int sum(**int a, int b**) { // a, b 는 **매개변수**
return a+b;
}
public static void main(String[] args) {
Sample sample = new Sample();
int c = sample.sum(**3, 4**); // 3, 4는 **인수**
System.out.println(c); // 7 출력
}
}
package chap05_OOP.A_encapsulation;
public class Run {
public static void main(String[] args) {
Encapsulation01 encap = new Encapsulation01();
encap.deposit(100);
encap.withdraw(50);
encap.withdraw(150);
encap.checkBalance();
}
}
<button onclick="test1();"> 선언적 함수 </button>
<script>
function test1(){
console.log('test1함수 실행'); // 선언적 함수
}
</script>
2.익명 함수
fuction 뒤에 함수명이 없는 함수 함수를 변수에 넣고 변수명으로 호출
이유 : 호출할려해도 이름이 없기에 변수에 넣고 변수명으로 대체
<button onclick="test2();"> 익명 함수 </button>
<script>
var test2 = function**()** { // fuction 뒤에 이름이 없는 함수
// 함수를 변수에 넣고 변수명으로 호출
console.log('test2함수 실행'); //
}
</script>
함수 전달인자와 매개변수
1.매개인자로 전달하기
지정된 매개변수보다 많은 개수를 호출하는 것을 허용, 초과된 인자는 무시됨 지정된 매개변수보다 적은 개수를 호출하는 것을 허용, 전달되지 않은 매개변수는 undefined
함수 위아래 2개가 있고 위의 함수(익명함수)가 아래 함수(선언적 함수)를 호출하는 형태
위쪽 익명함수가 test3(인자o), test3(인자x) 순으로 아래 선언적함수를 2번 호출하는 형태
<script>
document.getElementById('btn1').onclick = function(){ // getElement로 속성 접근. 클릭하면 해당 함수를 실행하라는 의미
test3('안녕','반가워');
test3(); // 자바에서 매개변수 있는 메소드에 매개변수 전달 안하면
// 에러가 났는데, 얘는 undefined를 출력
// 지정된 매개변수보다 적은 개수를 호출하는 것을 허용, 전달되지 않은 매개변수는 undefined
}
function test3(value){ // 매개변수 1개인데 위의 test3는 2개이므로 자바라면 에러나지만, js는 오류 안나고 실행됨. 반가워는 안찍힘
console.log('test3호출'); // test3호출
console.log(value); // 안녕 // 위의 test3('안녕','반가워');에서 인자가 안녕,반가워 2개인데 value로 앞의 '안녕'만 들어감
// undefined // 두번째로 test3()로 호출되서 test3()에서는 인자가 없으므로 undefined
console.log(arguments); // Arguments(2) ['안녕', '반가워', callee: ƒ, Symbol(Symbol.iterator): ƒ]
// Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ] // test3()의 호출. 인자가 없으므로 argument도 받은 인자x
// arguments : 내가 넘겨 받아온 것을 다 담아오는 것 // arguments 처음 사용
// 안녕,반가워를 위에서 받은거를 arguments에 다 배열로 저장하는 식
}
</script>
arguments
넘겨받은 모든 인자들을 저장해두는 ‘배열’
ex)안녕,반가워를 위에서 받은거를 arguments에 다 배열로 저장
(대괄호[]로 남겨있는걸 보면 배열인걸 알 수 있음)
js내장함수
2.매개인자로 스스로를 전달하기
2가지 방법
방법1 : 인자 직접 설정
button 태그 test4() 안 매개변수인 js,jquery를 function test4(subject) 안에 넣어주고 얘는 다시 alert(subject)로 넣어준다
<button onclick='test4("JavaScript--");'>방법1 : JavaScript</button>
<button onclick='test4("jQuery--");'>방법1 : jQuery</button>
<script>
// 방법1
// 인자 직접 설정해주는 것이 가장 간단한 방법
// button 태그 test4() 안 매개변수인 js,jquery를
// function test4(subject) 안에 넣어주고 얘는 다시 alert(subject)로 넣어준다
function test4(subject){
alert('오늘 배울 내용은 '+ subject + '입니다.'); // 오늘 배울 내용은 jQuery--입니다.
}
</script>
방법2 : this를 통한 button 요소값 전달 + innerHTML
button 태그 test5() 안 매개변수인 this는 버튼의 내용인 '방법2 : JavaScript'를 인자로 받아 function test5(subject) 안에 넣어주고 얘는 여기서 다시 alert(subject.innerHTML)로 넣어준다
<button onclick='test5(this);'>방법2 : JavaScript</button>
<button onclick='test5(this);'>방법2 : jQuery</button> <!-- this : 지금 현재 내가 있는 곳에 대한 코드를 의미 -->
<script>
// 방법2
// this를 통한 button 요소값 전달 + innerHTML
// button 태그 test5() 안 매개변수인 this는 버튼의 내용인 '방법2 : JavaScript'를 인자로 받아
// function test5(subject) 안에 넣어주고 얘는 여기서 다시 alert(subject.innerHTML)로 넣어준다
function test5(subject){
// 온클릭 this에서 함수 파라미터인 subject에 넣을 때 뭐라고 찍히나 확인해보자
console.log(subject) // <button onclick='test5(this);'>JavaScript</button>
alert('오늘 배울 내용은 '+ subject.innerHTML + '입니다.'); // 오늘 배울 내용은 방법2 : jQuery입니다.
}
</script>
3.함수의 리턴처리
함수에서 다른 함수를 호출하여 리턴값 받아오기
test6() 함수에서 값을 리턴하는 returnFunc()함수를 호출하여 test6()에서도 값 리턴할 수 있게 만든 구조
<button onclick="test6();">함수 리턴처리</button>
<script>
function test6(){
// 반환타입이 없다고 리턴할 수 없는건 아님
var ran = returnFunc ();
alert(ran); // 알림창으로 값 리턴됨 : 68.4503529682732
}
function returnFunc(){
return Math.random() * 100 + 1; // Math.random() : 랜덤값 부여 함수. 범위:0~1까지
// test6()에 리턴해줌. 위의 test6()함수의 ran 변수가 해당 함수의 리턴값을 받아 담음.
}
</script>
<innerText & innerHTML 차이>
// innerText : 해당 태그의 텍스트만 가져온다
function setInnerText() {
const element = document.getElementById('content');
element.innerText = "<div style='color:red'>A</div>"; -> 출력값 : <div style='color:red'>A</div>
}
// innerHTML : html 요소를 적용시킨 상태에서 값을 반환한다. 즉, html의 태그들을 적용시키고 태그사이의 값을 반환한다
function setInnerHTML() {
const element = document.getElementById('content');
element.innerHTML = "<div style='color:red'>A</div>"; -> 출력값 : (빨간색 글씨) A
}
1)button test7(calledFunction)의 calledFunction인자가 function test(v)의 매개변수인 (v)로 들어감 2)v();의 v에는 calledFunction이 담겨있으므로 아래의 fuction calledFunction(){} 함수를 호출
<button onclick='test7(calledFunction);'> 매개변수로 함수 전달</button>
<script>
function test7(v){ // v가 calledFunction을 받아옴
v(); //실행시키면 v가 calledFunction을 실행시키게 됨
}
function calledFunction(){
alert('calledFunction 실행'); // calledFunction 실행
}
// 내부 로직 설명
// 1)button test7(calledFunction)의 calledFunction인자가 function test(v)의 매개변수인 (v)로 들어감
// 2) v();의 v에는 calledFunction이 담겨있으므로 아래의 fuction calledFunction(){} 함수를 호출
</script>
5.함수 리턴
함수에서 다른 함수를 호출하여 리턴값 받아오기
내부 로직 설명
1)button 태그에서 test8()함수 호출
2)function test8() 함수 내부에서 return 으로 함수 리턴시킴
3)return으로 받아온 함수가 button test8()을 들어감
받아온 함수 실행을 위해 button test8()에 소괄호()를 추가
<!-- function 받아와서 실행시켜줘야해서 onclick="test8()();"에다가 ()소괄호 추가 -->
<button onclick="test8()();">함수 리턴</button> <!-- 실행을 위한 소괄호() 한번 더 붙임 -->
<script>
function test8(){
return function(){ // 함수 반환 // 익명함수
alert('함수 반환 성공'); // 결과값이 아무것도 나타나지는 않으나 펑션을 반환받음. test8이 펑션 자체임
} // 내가 받아온 것을 실행시키기 위해 button test8()에 ()를 추가. 실행시켜야되니 뒤에 소괄호 한번 더 붙여줌
} // function test8()에서 button test8()으로 펑션만 받아온거지 실행한게 아니라서 실행용 소괄호를 넣어줘야함
</script>
내장 함수
1. eval()
문자열을 JS코드로 변환해서 실행시켜주는 함수
내장함수 eval()
<input type="text" id="test1"><button onclick="test9();"> 내장함수 : eval()</button>
<script>
function test9(){
var test = document.getElementById('test1').value;
console.log(test); // 1+1 // // input창에 있는 입력값이 콘솔에 잘 출력됨.
console.log(eval(test)); // 1+1을 입력하면 2를 출력함.
//문자열을 자바스크립트 코드로 변환해서 실행을 시켜주는것.
// 1+1 문자열이 아닌 자바스크립트 코드로 변환을 하니
// 계산식이 되어 2가 출력된것.
var str = '';
str += 'var num1 = Number(prompt(" 2"));';
str += 'var num2 = Number(prompt(" 2"));';
str += 'var sum = num1 + num2;';
str += 'alert(num1 + " + " + num2 + " = "+ sum);';
console.log(str);
eval(str); // eval()을 통해 진짜 코드로 바꿔보겠다
}
</script>
2.infinity & NaN
infinity와 NaN을 찍어보면 넘버타입
방법1 : == 사용
infinity는 ==, isFinite() 둘다 가능 NaN는 isNaN()만 가능
방법2 : isFinite() & isNaN() 사용
isFinite 유한한지,정해진 수가 있는지 물어보는 것 isFinite()를 쓰면 매개변수 안에 숫자가 유한한지 물어보는 거기 때문에 무한인 Infinity니가 들어가면 false로 뜨는 것
NaN은 == 비교 불가능(isNaN으로 확인해야함)
function test10(){
var num1 = 10 / 0; // -> 자바에서 이러면 바로 ArithmeticException예외
var num2 = 10 / '강건강' ;
console.log(num1); // Infinity
console.log(num2); // NaN(Not a Number)
// 에러가 나지 않고 콘솔창보면 인피티니와 NaN(Not a Number)이 뜸
// 데이터 확인해보면 str이 아닌number 타입이 나옴
console.log(typeof num1); // number타입
console.log(typeof num2);
// 인피와 nan인지 아닌지 확인방법
// 방법1
// num1 == Infinity
console.log(num1 == Infinity); // true
// 방법2
// isFinite 유한한지 정해진 수가 있는지 물어보는 것
console.log(isFinite(num1)); // false
// Infinity니까 무한하지
console.log(isNaN(num2)); // true
console.log(num2 == NaN);
// 이렇게는 안됨, isNaN으로 확인해야함.
// 음의 무한대와 양의 무한대가 존재함
var num3 = -10 /0 ;
console.log(num3);// 음의 무한대
console.log(num3 == -Infinity); // true // 인피티 앞에 마이너스(-) 붙음
}
단순 반복만 대체가 아닌 함수 괄호 안에 입력값에 따라 메소드가 다르게 작동하게 하는 방법?
- 해당 메소드 안 println() 안에 변수명으로 바꿔주면, 밖에서 해당 메소드 호출하고 ()안에 입력되는 값에 따라 출력된다
- 아래 코드표 참조
메인 메소드 main(String[] args) {의 디테일한 의미
main이라는 메소드 있어야 자바가 프로그램을 호출한다는 약속
String뒤에 []는 문자열 배열
args는 자바가 메인메소드를 실행할 때, 입력해주는 입력값이 args를 통해서 들어가게됨
public static void printTwoTimes(String text) { 이 코드를 자바가 어떻게 받아들일까?
- printTwoTimes라는 메소드를 정의하고 있고, 이 메소드 ()안에 들어온 첫번째 값은 반드시 String타입으로 받으며, {}안에서 text라는 변수의 값이 되겠구나라고 생각한다
- 이 메소드 밖에서 printTwoTimes 메소드를 호출하면 printTwoTimes()안에 첫째값을 "a"이구나 그럼 자바는 text 값은 {}안에서 "a"이구나라고 생각
- printTwoTimes메소드 안에 "a”를 변수명 text로 변경하면, 메소드 데이터를 추가해야할 것을 더이상 수정할 필요가 없게됨
- 메소드명(데이터타입 변수명) {메소드 작동내용}
만약 위의 구분표시----를 다른걸로 메소드처럼 일괄 변환하고 싶다면?(두번째 변수 추가)
public static void printTwoTimes2(String text, String delimiter) {처럼 두번째 파라미터 추가와 메소드 밖에서 호출할 메소드 ()에도 인자를 추가해주면 된다
// delimiter 매개변수를 추가함
public static void printTwoTimes2(String text, String delimiter) {
System.out.println(delimiter); // delimiter 구분자라는 의미
System.out.println(text);
System.out.println(text);
매개변수(parameter) : 아래 새로 만든 메소드 안에 변수명을 매개변수한다
메소드 밖에서 메소드를 사용하는 쪽으로 주입한 값을 메소드 안으로 흘려보내주는 매개자라고 해서 매개변수
인자(arguement) : 해당 메소드 밖에서 호출하는 메소드명 ()안에 입력값을 인자라 한다
public class method04 {
public static void main(String[] args) { // main이라는 메소드 있어야 자바가 프로그램을 호출한다는 약속
// String뒤에 []는 문자열 배열. args는 자바가 메인메소드를 실행할 때, 입력해주는 입력값이 args를 통해서 들어가게됨
printTwoTimes("a");
// 1억번 코드 반복
printTwoTimes("b");
// 1억번 코드 반복
printTwoTimes2("a","----"); // delimiter(구분자) 적용 메소드 호출
printTwoTimes2("a","****");
printTwoTimes2("b","%%%%");
printTwoTimes2("b","!!!!");
// 위의 함수 안에 입력 된 값을 인자(argument)
}
// 아래 text, delimiter와 같은 변수를 파라미터(parameter)라고 부름.
// 메소드 밖에서 메소드를 사용하는 쪽으로 주입한 값을 메소드 안으로 흘려보내주는 매개자라고 해서 매개변수
public static void printTwoTimes(String text) {// 이 코드를 자바가 어떻게 받아들일까?
System.out.println("----"); // printTwoTimes라는 메소드를 정의하고 있고
System.out.println("a"); // 이 메소드 ()안에 들어온 첫번째 값은 반드시 String타입으로 받으며
System.out.println(text); // {}안에서 text라는 변수의 값이 되겠구나라고 생각한다
} // 메소드명(데이터타입 변수명) {메소드 작동내용}
// 이 메소드 밖에서 printTwoTimes 메소드를 호출하면 printTwoTimes()안에 첫째값을 "a"이구나
// 그럼 자바는 text 값은 {}안에서 "a"이구나라고 생각
// printTwoTimes메소드 안에 "a'를 변수명 text로 변경하면, 추가되거나 수정할 메소드 데이터를 더이상 할 필요가 없게됨
// 만약 위의 구분표시----를 다른걸로 메소드처럼 일괄 변환하고 싶다면?
public static void printTwoTimes2(String text, String delimiter) {
System.out.println(delimiter); // delimiter 구분자라는 의미
System.out.println(text); //
System.out.println(text);
}
}
def personal_info(**kwargs): # info 뒤 ( ) 안이 매개변수
for key, value in kwargs.items():
print(key, ': ', value, sep = '')
y = {'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}
personal_info(**y)
결과값
name: 홍길동
age: 30
address: 서울시 용산구 이촌동
*설명
맨 아랫줄 인수 personal_info(**y)에 바로 윗줄 y변수의 정보가 들어가고 **이게 붙어서
키워드 매개변수로써 첫째줄의 def의 매개변수 자리에 들어가서 함수 def personal_info가 작동한다
def : 함수를 만들 때 사용하는 예약어
매개변수(parameter) : 함수에 입력으로 전달된 값을 받는 변수 함수 이름 뒤 괄호 안의 것
인수(arguements) : 함수를 호출할 때 전달하는 입력값
사용법
함수를 정의하고 거기에 함수 밖에서 보내올 데이터(변수)를 받을 매개변수 타입을 지정하고, 작성한 함수에 밖에서 변수(인수)를 지정하면 작동된다.
종류
세가지는 혼용가능
고정 매개변수(parameter) : args = 1 or True
가변 매개변수(parameter) : *args
키워드 매개변수(parameter) : **kwargs
1)고정 매개변수(parameter)
매개변수 값을 지정하여 변동이 없게하는 매개변수
여러개 써도 순서는 상관x
ex) a=1, man=True
아래에서 a=3,b=7이 매개변수를 지정한 것으로 고정매개변수
def add(a, b):
return a+b
result = add(a=3, b=7) # a에 3, b에 7을 전달
print(result)
결과값
10
숫자 뿐 아니라, True나 False도 미리 지정해두고 사용가능
man = True
def say_myself(name, old, man=True):
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살입니다." % old)
if man:
print("남자입니다.")
else:
print("여자입니다.")
say_myself("박응용", 27)
say_myself("박응용", 27, True)
결과값
나의 이름은 박응용입니다.
나이는 27살입니다.
남자입니다.
2)가변 매개변수(parameter)
매개변수 앞에 *을 하나 붙인 것이며, 여러 개의 입력값을 입력가능. 튜플로 출력됨.
값이 몇 개가 될지 모를 때 사용하며, 입력값을 전부 모아서 Tuple로 만듬
def add_many(*args):
result = 0
for i in args:
result = result + i
return result
result = add_many(1,2,3)
print(result)
결과값 : 6
result = add_many(1,2,3,4,5,6,7,8,9,10)
print(result)
결과값 : 55