🙋 변수의 종류는?
1. 전역변수 2. 지역변수 3. 정적변수
🙋 클래스 선언(인스턴스화)에 올 수 없는 것은?
지역변수
🙋 올 수 있는 것은?
전역변수, 정적변수 접근 가능 / 인스턴스 변수
🙋 ( )괄호가 있으면 3가지 중 하나
1. (뒤에 괄호가 있으면) 메소드
2. (클래스 이름 다음에 괄호가 있으면) 생성자
3. 캐스팅 연산자(강제변환)
1. 전역변수
- 클래스 전역에서 사용할 수 있다
- 전역 변수의 위치는 클래스 선언한 바로 다음이다
public class Test { ----------- 전역변수 위치 ------------ int i; // 전역변수는 초기화를 생략할 수 있다 public static void main(string[] args) { // 전역변수 호출하기 Test t = new Test(); t.i=5; // 전역변수 i의 값을 5로 초기화 System.out.println(t.i); // 출력 값 5 t.i=100; // i의 값을 100으로(변수에는 한 번에 하나의 값만 기억 됨) System.out.println(t.i); // 출력 값 100 } // end of main } // end of Test
- 전역변수의 선언과 초기화를 분리해서 작성할 수 없다
- int의 디폴트 값 0 / double 디폴트 값 0.0 / boolean 디폴트 값 false
2. 지역변수
- 메소드 내부나 생성자 내부에서만 사용할 수 있다
public class Test1 { int i = 1; // 전역변수 ~~int i = 2;~~ // 전역변수가 중복되기 때문에 에러 public void methodA() { /* 메소드 선언: 좌중/우중괄호를 사용해서 영역 표시 메소드를 호출: 세미콜론으로 끝낸다 메소드 내에서 선언된 변수는 모두 지역의 성격 그래서 메소드 이름이 다르며, 같은 변수 이름 사용이 가능하다 */ int i = 2; // 지변 - 지변이라서 같은 변수명을 사용할 수 있는 것. i = 3; // 3으로 재정의 ~~int i = 3;~~ // 불가능. 에러 int j; // 지역변수는 반드시 초기화해야 한다 했는데 왜 에러가 안뜸? // -> 선언이기 때문에. 변수 앞에 타입이 있으면 선언 System.out.println("메소드A 호출 성공"); } public static void main(String[] args) { Test1 t1 = new Test1(); // 인스턴스화. t1은 인스턴스 변수 t1.methodA(); } }
처리 순서: 9→11→12→5→6→7→13→14

질문 사항
package com.step1;
public class Test1 {
int i = 1;
public void methodA() {
int i =2;
Test1 t1 = new Test1();
// 왜 여기에 인스턴스화를 했을까?
int j;
j = 4;
~~System.out.println(t1.j);~~ // 에러
// 지역변수는 인스턴스변수.호출할 수가 없다
System.out.println(t1.i); // 이거는 왜 되지?
}
public static void main(String[] args) {
Test1 t1 = new Test1();
t1.methodA();
}
}
3. 정적변수
- 하나만 만들어져서, 하나를 가지고 여러 사람이 사용
ex. 서비스를 싱글톤으로 지원할게~(서버가 다운되면 안 되니까)package com.step1; class P { // 하나의 클래스 문서에 public이 2개 올 수 없다 static int i = 1; int j = 10; } public class Test2 { public static void main(String[] args) { System.out.println(P.i); } }
- static이 붙은 변수 i는 인스턴스 변수가 아니라서 호출할 때 클래스 이름을 쓴다
package com.step1; public class Test3 { public static void main(String[] args) { P p = new P(); System.out.println(P.i); // 1 System.out.println(p.i); // 1 System.out.println(P.j); // 실행 안됨 System.out.println(p.j); // 10 } }
- static은 클래스급이라서 인스턴스화 없이 호출이 가능
static이 붙은 변수는 원시가 아닌 참조라서.- (P.j) 호출에서 j는 static이 아니라서 (클래스 이름.j)로 호출이 불가함
→ 왜? 그냥 규칙임(API)- 해결 방법: 인스턴스화를 하고 (인스턴스변수.j)로 호출
<메인1 - Test2> package com.step1; class P { static int i = 1; int j = 10; } public class Test2 { public void methodC() { P.i = P.i + 2; } public static void main(String[] args) { P.i=2; System.out.println(P.i); } }<예제1 - Test4> package com.step1; public class Test4 { // 메인메소드는 콜백이라서 개발자가 호출할 수 없다 public static void main(String[] args) { System.out.println(P.i); } }
- 출력값 1: Test2 P class에 선언된 정적 변수 값
<예제2 -Test4> package com.step1; public class Test4 { // 메인메소드는 콜백이라서 개발자가 호출할 수 없다 public static void main(String[] args) { Test2 t2 = new Test2(); t2.methodC(); System.out.println(P.i); } }
- 출력값 3: 위 코드에서 methodC를 경유하였으므로 P클래스의 정적변수 i는 1에서 3으로 변경됨
<예제3 -Test4> package com.step1; public class Test4 { // 메인메소드는 콜백이라서 개발자가 호출할 수 없다 public static void main(String[] args) { Test2 t2 = new Test2(); // 첫 번째 호출 되었을 때, 1에서 2가 더해진 결과가 유지되고 있었다 t2.methodC(); t2 = new Test2(); t2.methodC(); System.out.println(P.i); } }
- 출력값 5: 인스턴스화를 두 번 했고(새로운 클래스 객체가 또 만들어지는 것), 메소드도 두 번 호출했기 때문
DB서버는 회원 정보를 갖고 있음
로그인 버튼 눌렸을 때 서버에 찾아달라고 해야함
입력을 2개 받기 때문에 스트링 2개 필요
인증을 해주면 권한을 받아
파라미터는 2개, 리턴타입은 1개만 있으면 된다. 왜? 이름만 불러주면 되니까.
리턴타입
- 메소드 리턴타입에 void가 아닌 원시형 또는 참조형이 오면 반드시 마지막에(맨 끝에) return 예약어를 쓴다
package com.step2; public class Method1 { public String login(String id, String pw) { // 리턴타입이 String이니까 다음에 오는 변수는 타입을 맞춰야 한다 return "로그인"; } public int methodA() { return 1; } public double methodB() { return 3.14; } public boolean methodC() { return true; } public void methodD() { // void는 예약어를 쓰지 않아도 괜찮음 } public static void main(String[] args) { } }
- (String id, String pw)는 지변 / 선언만 / 초기화x 상태
- login 호출하려면 인스턴스화 해야 한다
ex. 인스턴스변수.login(" ", " ");
: 두 개의 파라미터 값은 String이 와야 한다
파라미터(매개변수) / 메소드<예제1> package com.step2; public class Method1 { public String login(String id, String pw) { return "로그인"; } public static void main(String[] args) { \Method1 m = new Method1(); String name = m.login("kiwi","123"); // 세미콜론으로 끝났기 때문에 메소드 호출(6번 라인) System.out.println(name); } }
- 출력: 로그인
-m.login이 String name에 대입됐기 때문에<예제2> package com.step2; public class Method1 { public String login(String id, String pw) { // 리턴타입이 String이니까 다음에 오는 변수는 타입을 맞춰야 한다 System.out.println("ID => " + id + ", PW ==> "+pw); String name = "정다은"; return name; } public static void main(String[] args) { Method1 m = new Method1(); String name = m.login("kiwi","123"); System.out.println(name); } }
- 출력: ID => kiwi, PW ==> 123
정다은<예제3> package com.step2; public class Method2 { public String login(String id, String pw) { System.out.println("ID => " + id + ", PW ==> "+pw); String name = "나신입"; return name; } public void methodD() { } public static void main(String[] args) { Method1 m = new Method1(); ~~m.login("kiwi","123");~~ // 앞에 변수 선언이 안 돼서 에러가 나는 것 System.out.println(name); } }<예제4> package com.step2; public class Method2 { public String login(String id, String pw) { // 리턴타입이 String이니까 다음에 오는 변수는 타입을 맞춰야 한다 System.out.println("ID => " + id + ", PW ==> "+pw); String name = "나신입"; return name; } public void methodD() { } public static void main(String[] args) { Method1 m = new Method1(); System.out.println(m.login("kiwi","123")); // 메소드 호출할 때 파라미터 자리에서 리턴타입이 있다면 호출 가능 } } 출력: ID => kiwi, PW ==> 123 나신입<예제5> package com.step2; public class Method2 { public String login(String id, String pw) { System.out.println("ID => " + id + ", PW ==> "+pw); String name = "나신입"; return name; } public int methodD() { return 0; } public static void main(String[] args) { Method2 m = new Method2(); System.out.println(m.login("kiwi","123")); System.out.println(m.methodD()); } } 출력: ID => kiwi, PW ==> 123 나신입 0<예제6> package com.step2; public class Method3 { public String login(String id, String pw) { String name = "나신입"; return name; } public void methodD() { } public static void main(String[] args) { Method3 m = new Method3(); ~~int i = m.methodD();~~ // 왜 에러가 날까? // methodD()는 리턴타입이 void라서(반환할 수 없어서) // 대입연산자를 통해서 받을 수가 없음 String name = m.login("apple", "123"); // 여기는 String이니 괜찮은 것 } }<예제7> package com.step2; public class Method4 { public String login(String id, String pw) { String name = "나신입"; return name; } public void methodD(String name) { System.out.println("methodD 호출 성공 "+name); } public static void main(String[] args) { Method4 m = new Method4(); String name = m.login("apple", "123"); // main 안에서 선언한 지변 name의 값을 굳이 methodD에서 쓰고 싶다면? m.methodD(name); } } 출력: methodD 호출 성공 나신입
리턴타입으로 성적 구하기
<예제1> 1. 평균을 구하는 메소드를 구현하시오. 단, total 메소드의 반환값으로 총점을 가져와서 처리해 볼 것 2. 총점을 구하는 메소드의 리턴타입으로 총점을 받아서 평균을 구하는 메소드를 선언해 보시오. // package com.step2; public class sungjuk { public int total(int no1, int no2, int no3) { // 총점을 구하는 메소드 선언(파라미터 자리는 선언만 가능) return no1+no2+no3; } public double avg() { int result = total(75, 80, 85); System.out.println(); return result/3.0; } public static void main(String[] args) { sungjuk sj = new sungjuk(); // 여기서 인스턴스화는 이미 했음 int tot = sj.total(75,80,85); System.out.println(tot); // avg 메소드 호출 double result = sj.avg(); System.out.println(result); } } 출력: 240 (결과 없음) 80.0<예제2> package com.step2; public class sungjuk2 { public int total(int no1, int no2, int no3) { int tot = no1+no2+no3; // 두 번째에서는 총합을 구해서 담는 변수를 하나 더 지변으로 선언 return tot; } public double avg(int tot) { int result = total(75, 80, 85); return result/3.0; } public static void main(String[] args) { sungjuk2 sj = new sungjuk2(); int tot = sj.total(75, 85, 95); double account = sj.avg(tot); System.out.println(account); } } 출력: 80.0<예제3> package com.step2; public class sungjuk3 { public int total(int no1, int no2, int no3) { int tot = no1+no2+no3; return tot; } /***************************** * 평균을 구하는 메소드 구현 * @param tot - 총점을 받아서 사용함 * @param d - 학생들의 평균을 구할 때 학생수를 분모로 받습니다. 단 평균을 실수가 나올 수 있으므로 double로 함 * @return - 구한 평균값을 반환하기 ******************************/ public double avg(int tot, double d) { return tot/d; // 평균을 구할 때 분모에 들어갈 변수를 파라미터로 받기 } public static void main(String[] args) { sungjuk3 sj = new sungjuk3(); int tot = sj.total(75, 85, 95); double account = sj.avg(tot,3.0); System.out.println(account); } } 출력: 85.0
<추가 예제>
package com.step2;
import java.util.Scanner;
// java.lnag 폴더에 없는 클래스니까 import 해야함
public class Userinput {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int i=0;i<3;i=i+1) {
// for(초기화;조건식;증가연산자);
System.out.println("요기 ===>" +i);
System.out.println(i+"번째 학생 점수 입력");
int jumsu = sc.nextInt();
System.out.println("입력받은 점수는 "+jumsu+"입니다.");
} // end of for
} // end of main
}
출력: 요기 ===>0
0번째 학생 점수 입력
🖱 단축키
기타