🙋 변수의 종류는?
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번째 학생 점수 입력

이클립스 디버깅

  1. 코드 중 의심가는 부분 좌측 라인 더블클릭(or 우클릭 - Toggle Breakpoint)
  2. 브레이크 포인트가 찍힘
  3. 상단 벌레모양 디버스 클릭 / Run→Debug / 단축키 F11
    3-1. Step Into(F5) : 한 줄씩 진행 / 함수 안이면 함수 안으로 들어감
    3-2. Step Over(F6) : 한 줄씩 진행 / 함수 호출은 패스함
  4. 디버깅을 시작하면 브레이크 포인트 지정 부분에 멈춤

🖱 단축키

  • Alt 누른 채로 위, 아래 화살표 누르면 코딩 줄이 이동함

기타

  • 컴퓨터를 사용하게 된다면 cpu는 별로 중요하지 않고, RAM은 16GB 이상 장착하는 게 좋을 것 같다
  • 색깔 선택할 사이트 찾을 때 구글 검색어: html color picker

0개의 댓글