[2023.09.22] 개발자 교육 5일 차 : 강의-무한복습, 일주일 돌아보기, step 확인[구디 아카데미/김승수 강사님]

DaramGee·2023년 9월 22일
0
post-thumbnail

오늘 정리

코딩연습은? 여러 방식을 경험해보면서 차근차근 확장해 나간다. 기초부터 천천히 꾸준히 하면 된다.

첫 성적계산 코드는? 일차원적인 생각으로 첫 코드를 만들었다면, 앞으로 배우는 개념들을 통해 조금씩 수정해 나가보기로 했다.

복습 - 한 주 돌아보기(week1 패키지)


Week 1

  • 변수
    • 변수 선언은?
      • 타입 변수명; (선언만)
      • 타입 변수명 = 값;(선언, 초기화)
    • 변수의 종류는?
      • 원시형 변수(호출하면 값이 나온다)
        • 예) int(정수), double(실수), boolean(true, 'false'(디폴트)->조건문, 반복문 때 사용)
      • 참조형 변수(호출하면 주소 번지가 나온다. 어렵다 - 조금 더 투자하기)
        • 예 : @~~~
  • 클래스(Pride, Sonata, Truck… → 첫 글자 대문자로)
    • 우리 주변에 존재하는 모든 사물을 클래스로 설계할 수 있음
    • 클래스 = 변수(기억해줘) + 메소드()
      • 클래스 정의(설계) → 클래스를 나타낼 수 있는 변수와 메소드를 결정하는 것이다.
    • 클래스 안에 메소드가 있어도 호출되지 않으면 사용 x
  • 메소드
    • 다른 메소드 안에서도 다른 클래스의 메소드를 호출할 수 있지만, 우리가 작성한 코드를 실행하는 것은 JVM이므로 메인 메소드 안에서 호출하는 것이 시작임.
    • 메소드 선언 문장
      • (접근제한자) 리턴타입 메소드이름(파라미터자리){ }
      • 메소드 선언 시 리턴타입이 오는 자리에 void가 있다면 return예약어 쓸 수 x → 리턴되는 값이 없다면 다른 메소드에서 그 메소드가 가진 데이터를 재사용할 수 x
      • 리턴 다음에 오는 코드는 반드시 타입을 맞춰야 함.(또는 강제형변환 사용)
      • 하나만 반환할 수 있다
      • 만약 여러 개를 반환하고자 한다면 참조형 타입을 사용 : step 1-3)

Step 1-1 → 클래스 두 개로 원시형 타입 연습

  • 변수(WVariable
    • 변수종류
      • 전역변수 : 초기화 생략 가능, 클래스 선언 뒤, 전역변수로 선언한다면 그 클래스를 떠올릴 수 있는 변수여야 함.(여러 클래스에 값을 위에 작성하는 것 x)
      • 지역변수 : 반드시 초기화 필요(안 하면 런타임 에러 生), 메소드 안
    • 변수는 메소드 선언 시 또는 메소드 호출 시에도 사용된다.
    • 변수가 올 수 있는 위치에 올 수 있는 것
      • 리턴타입 자리(원시형, 참조형 둘 다 가능)
        • 타입만 옴, 그 이유는 선언하는 자리가 아니기 때문
        • 리턴타입에 클래스가 오는 코드를 자유롭게 사용할 수 있도록 연습 필요
      • 파라미터 자리
        • 타입과 변수명이 옴, 그 이유는 지역변수를 선언하는 자리이기 때문
          • methodA(int) → x
          • methodA(int i) → o 파라미터 자리에 선언한 변수 i는 정수형을 담으면서 변수의 이름은 i이고, 지역변수이기 때문에 그 메소드 안에서 초기화를 반드시 해야 한다.
        • 파라미터 자리에는 변수선언이 없어도 되고, 하나여도 되고, 여러개여도 괜찮음
  • 리턴타입(WReturn,WReturn2,Print1,Print2
    • 리턴타입이 있는 경우, 대입연산자를 써서 반환되는 값을 담을 수 있다.

    • 메소드 파라미터 자리에 또 다른 메소드 호출 가능하다(→ Param 확인)
      - 단, 리턴 타입이 없는 void인 경우는 예외

      package com.week1;
      
      public class Print1 {
      	static int m() {return 5;}
      	static void n() {}
      	public static void main(String[] args) {
      		System.out.println(1);
      		System.out.println("안녕");
      		System.out.println(1.5);
      		System.out.println(true);
      		System.out.println(Print1.m()); //return타입이 있는 int 여서 출력 o
      		System.out.println("========");
      //		System.out.println(Print1.n()); //return타입이 없는 void여서 출력 x
      	}
      }
      /*
      1
      안녕
      1.5
      true
      5
      ========
      */
      package com.week1;
      
      public class WReturn2 {
      	int i;  // 전역변수 i 
      	void methodA() { //리턴타입이 못오는 리턴타입 void를 사용
      		int i = 2; //지역변수
      		System.out.println("지역변수 i " + i);
      	}
      	int methodB() { 
      		int i = 1; //지역변수 i
      		return i;  //i=1
      	}
      	
      	public static void main(String[] args) {
      		WReturn2 w=new WReturn2();
      		System.out.println("메인에서 methodB 호출 w.methodB()"+ w.methodB()); //메소드B는 리턴타입이 오는 리턴타입 int를 사용해서 메인에서 출력 가능
      		w.methodA(); //메소드A는 리턴타입이 못오는 리턴타입 void여서 해당 함수에서 출력을 남겨야 지역변수 출력 가능
      		System.out.println("클래스의 전역변수 호출 w.i "+w.i); // 전역변수 호출 
      	}
      }
      /*
      메인에서 methodB 호출 w.methodB()1
      지역변수 i 2
      클래스의 전역변수 호출 w.i 0
      */

Step 1-2

  • 파라미터
    • 파라미터 자리는 사용자가 입력한 자료를 담아주는 역할

Step 1-3 → 참조형 타입 연습

  • 파라미터
    • 원시형 타입 뿐 아니라 참조형 타입을 파라미터로 사용할 수 있도록 대비

실습 1. 변수

package com.week1;

//코딩연습할 때 가능하다면 두 개 클래스를 준비해주세요.(등장인물 두 개 등장 -> 전변에 대해 깊게 이해하게 됨)

class Dog{
	int leg = 4; //클래스 선언뒤 바로 입력 -> 전역변수
	public void running() {
		int leg = 6; //메소드 안에서 입력 -> 지역변수
		System.out.println("running메소드를 인스턴스화하여 호출 = "+leg + "개"); //왜 출력이 안될까? 메인메소드에 running 함수를 불러오도록 인스턴스화 하여 실행!! 
	}
}

public class WVariable {
	//16-17(인스턴스화 : 메모리에 로딩 중)-6-19
	
	public static void main(String[] args) {
		Dog myDog = new Dog();
		//6을출력할 수 있다 -> 전역변수가 호출되었다!!
		System.out.println("Dog 클래스를 인스턴스화하여 호출 =" + myDog.leg + "개");
		//6을 출력할 수 있나요?
		System.out.println("상수를 사용한 의미없는 호출 ="+6 + "개"); //상수를 출력하는 것은 의미x, 다른 방법 시도
		//running 메소드는 어느 클래스에 선언되어 있는가? 
		//그렇다면 러닝메소드를 호출하여 실행하면 됨
		myDog.running(); //6 출력 가능
	}
}
/*콘솔값
Dog 클래스를 인스턴스화하여 호출 = 4개
상수를 사용한 의미없는 호출 = 6개
running메소드를 인스턴스화하여 호출 = 6개
*/

실습 2. 파라미터

package com.week1;
//Account 클래스는 사용자에게 두 수(int)를 입력받아서 
//두 수의 합을 구하는 메소드를 구현하기 위해 설계 + 파라미터를 보여주기 위해 지역변수를 사용
class Account{ 
	int first; //이것은 전변이라서 초기화를 하지 않아도 0을 가지고 있다.
	int second;
//	int first, second; //이 값도 합법
	//파라미터를 사용하지 않고 계산하기 위해서는 전역변수를 사용해야 함.
	public void hap1() {
		System.out.println("Account 객체, hap1 함수를 호출하여 나온 값은 = "+(first + second)); // 출력문장이 있어도 hap1 메소드를 호출하지 않으면 작동하지  x
	}
	//두 수를 파라미터로 받아서 계산하므로, 지역변수로 가능함.
	//파라미터 자리에서는 초기화를 할 수 없음. 지역변수를 선언만 하는 자리이기 때문에!!
	//지역변수는 반드시 초기화를 해야 함 
	//그럼 언제? 어디에서 가능할까요?
	//파라미터 자리의 변수값은 호출될 때 결정되지만
	//호출되는 메소드 안에서 다른 값으로 변경될 수 있다.(Call by value)
	public void hap2(int first, int second) { //선언!!    , 메인에서 first는 1, second는 3으로 올라왔지만, 15번에서 바꿔치기 함.
//     int first로 못 쓰는 이유는? 위에서 이미 선언되었기에, 아래에선 초기화만 해야함. 두 번 선언x
		System.out.println("Account 객체, hap2를 인스턴스화하고,여 아래에서 올라온 온전한 값은 = "+(first+second)); //4
		first = 0;    //재정의 되었다.
		second = 1;
		System.out.println("hap2 메소드 안에서 재정의 되어 바꿔치기 되어 나온 값은 = "+(first + second)); //런타임 에러
	}
	public void hap3() {
	}

}//end of Account
public class AccountSimulation {

	public static void main(String[] args) {
		Account as = new Account();
		as.hap2(0, 0); //4가 출력될까?? 놉
//		as.hap2(); 오류 生, 메소드 호출할 때 반드시 파라미터 갯수나 타입 맞춰줘야 함. 
//		as.hap2(1, false); 오류 生, 메소드 호출할 때 반드시 파라미터 갯수나 타입 맞춰줘야 함. 
		as.hap1();
	}
}
/*콘솔값
Account 객체, hap2를 인스턴스화하고,여 아래에서 올라온 온전한 값은 = 0
hap2 메소드 안에서 재정의 되어 바꿔치기 되어 나온 값은 = 1
Account 객체, hap1 함수를 호출하여 나온 값은 = 0
*/

강의 내용

  • 참조형 타입(실습)

실습 1.

부서번호부서명지역
deptnodnameloc
10개발부서울
20운영부대전
30기획부제주
…n…n…n
  • 세로방향(원시형타입→각 변수값)
    • 같은 타입(원시형) → but 변수 n번 선언
    • 같은 타입을 한 번에 n개 선언 可 배열 → new를 n번 사용
  • 가로방향(참조형타입→하나의 클래스)
    • 서로 연관된 자료(변수, n개, (메소드))
    • 클래스 선언시 여러 종류 변수를 가져올 수 있음
    • 예 : Dept.java →는 세가지 변수를 갖고 있으나, 인스턴스화 하면 한 번에 모든 변수를 관리받고, 클래스도 하나의데이터 타입으로 받아들이자!!
  • 세로 방향 실습 → Dept 클래스의 deptno 값만 가져와보는 것
package com.week1;
class Dept1{ //이 클래스의 구성에대한 설명 & 한 번에 관계있는 이 내용을 참조형으로 불러오기 & 다른 클래스 생성시 틀로 사용
	int deptno = 10;
	String dname="개발부";
	String loc="부산";
}
class Dept{ //이 클래스의 설명이라고 생각 & 다른 생성을 할 때는 틀이라고 생각
	int deptno = 10;
	String dname="개발부";
	String loc="부산";
}
  • 같은 이름의 변수더라도 new를 사용하여 인스턴스화를 하면 새로운 객체가 生
  • 이 때, 변수가 세 개 정의되어있으므로 Dept클래스 선언 시 주었던 초기값을 deafault값으로 기억하고 있음.
  • 같은 이름의 변수이름인 deptno, dname, loc이지만 서로가 주소번지가 다르다.
package com.week1;
//세로방향 연습
public class DeptSimulation {

	public static void main(String[] args) {
		Dept dept = new Dept(); // 선언
//		Dept dept = new Dept(); 이건 왜? 이건 같은변수를 또 선언하는거여서 에러
		dept = new Dept(); //재정의, new를 사용하여 인스턴스화를 하면 새로운 객체가 生
		dept.deptno = 10;
		System.out.println(dept);
		System.out.println(dept.deptno);
		dept = new Dept(); //재정의
		dept.deptno = 20;
		System.out.println(dept);
		System.out.println(dept.deptno);
		dept = new Dept(); //재정의
		System.out.println(dept);
		System.out.println(dept.deptno  + " => 초기화 값이 없기 때문에 Dept의 기본값이 불러와짐");
	}
}
/*
com.week1.Dept@4e50df2e
10
com.week1.Dept@1d81eb93
20
com.week1.Dept@7291c18f
10 => 초기화 값이 없기 때문에 Dept의 기본값이 불러와짐
*/
package com.week1;
//세로방향 연습, 이럴 때 반복되서 작업되는 것을 반복문을 통해 줄이는 것 가능 
public class DeptSimulation {

	public static void main(String[] args) {
		Dept dept = new Dept(); // 선언
//		Dept dept = new Dept(); 이건 왜? 이건 같은변수를 또 선언하는거여서 에러
		dept = new Dept(); //재정의, 인스턴스화 할 때 마다 새로운 객체가 生
		dept.deptno = 10;
		dept.dname = "개발부";
		dept.loc = "서울";
		System.out.println(dept);
		System.out.println(dept.deptno + " ,"+ dept.dname + " ," +dept.loc);
		dept = new Dept(); //재정의
		dept.deptno = 20;
		dept.dname = "운영부";
		dept.loc = "대전";
		System.out.println(dept);
		System.out.println(dept.deptno + " ,"+ dept.dname + " ," +dept.loc);
		dept = new Dept(); //재정의
		dept.deptno = 30;
		dept.dname = "기획부";
		dept.loc = "제주";
		System.out.println(dept);
		System.out.println(dept.deptno + " ,"+ dept.dname + " ," +dept.loc);
	}
}
/*
com.week1.Dept@4e50df2e
10 ,개발부 ,서울
com.week1.Dept@1d81eb93
20 ,운영부 ,대전
com.week1.Dept@7291c18f
30 ,기획부 ,제주
*/
  • 세로 방향 실습 → Emp 클래스 활용
package com.week1;

public class Emp {
	//사원번호를 담을 변수 선언	
	int empno     = 0;
	//사원이름, 업무 담을 변수 선언
	String ename = null; 
	String job      = null; 	
}
package com.week1;
//int 디폴트값이 0으로 약속된 것처럼 클래스의 디폴트값은 null로 되어있다.
public class EmpSimulation {
	public void empPrint(Emp emp) { //?자리는 지역변수 자리, 호출될 때 결정된다
		System.out.println("empPrint메소드로 나온 값은 ?? " + emp.empno +", " + emp.ename +", " +emp.job);
	}
	public static void main(String[] args) {
		Emp emp = new Emp();
		EmpSimulation  es=new EmpSimulation(); //0, null, null
		es.empPrint(emp); //파라미터 자리에 인스턴스 변수 참조
//		System.out.println(emp.empno +", " + emp.ename +", " +emp.job);  

		emp = new Emp();
		emp.empno = 7566;      //재정의, 초기화
		emp.ename = "나신입"; //재정의, 초기화
		emp.job = "마케팅";      //재정의, 초기화
		es.empPrint(emp); //파라미터 자리에 인스턴스 변수 참조
//		System.out.println(emp.empno +", " + emp.ename +", " +emp.job); 이 방법 대신 위 메소드 활용

		emp = new Emp();
		emp.empno = 7499;      //재정의, 초기화
		emp.ename = "나초보"; //재정의, 초기화
		emp.job = "매니저";      //재정의, 초기화
		es.empPrint(emp); //파라미터 자리에 인스턴스 변수 참조
//		System.out.println(emp.empno +", " + emp.ename +", " +emp.job); 이 방법 대신 위 메소드 활용
	}
}
/*
empPrint메소드로 나온 값은 ?? 0, null, null
empPrint메소드로 나온 값은 ?? 7566, 나신입, 마케팅
empPrint메소드로 나온 값은 ?? 7499, 나초보, 매니저
*/
package com.week1;

public class EmpSimulation2 {
	//main메소드에서 인스터스화 한 Emp의 주소번지(지역변수)를 setEmp 즉 다른 메소드에서 사용하려면
	//메소드의 파라미터 자리를 이용하세요
	void setEmp(Emp emp) {           //null; -> emp = new Emp();
		//insert here
		emp = new Emp();
		emp.empno = 7566;             //변수값 재정의
		emp.ename = "Smith"; 
		emp.job = "영업";
		System.out.println("============before============");
		System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
	} //end of setEmp
	public static void main(String[] args) {
		EmpSimulation2 es2 = new EmpSimulation2();
		Emp emp = new Emp();        //사원집합 클래스를 인스턴스화
		es2.setEmp(emp);                 // 16번이 먼저실행 - > 10번줄이 먼저 호출 (값 : 0, null, null)
		System.out.println("============after============");
		System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
		}
}
/*
============before============
7566, Smith, 영업
============after============
0, null, null
*/
package com.week1;

public class EmpSimulation2 {
	//main메소드에서 인스터스화 한 Emp의 주소번지(지역변수)를 setEmp 즉 다른 메소드에서 사용하려면
	//메소드의 파라미터 자리를 이용하세요
	void setEmp(Emp emp) {           //null; -> emp = new Emp();
		//insert here
//		emp = new Emp();
		emp.empno = 7566;             //변수값 재정의
		emp.ename = "Smith"; 
		emp.job = "영업";
		System.out.println("============before============");
		System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
	} //end of setEmp
	public static void main(String[] args) {
		EmpSimulation2 es2 = new EmpSimulation2();
		Emp emp = new Emp();        //사원집합 클래스를 인스턴스화
		es2.setEmp(emp);                 // 16번이 먼저실행 - > 10번줄이 먼저 호출 (값 : 0, null, null)
		System.out.println("============after============");
		System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
		}
}
/*
============before============
7566, Smith, 영업
============after============
7566, Smith, 영업
*/

강의 마무리

  • 성적계산하는 클래스 2개 생성
package com.week1;

public class Sungjuk {
	String name = null;              //학생이름
	int scoreH;                      //html 점수
	int scoreC;                      //css 점수
	int scoreJ;                      //java 점수
	int scoreSum;                    //score 합
}
  • 보완
    • 개인정보이다 보니 private으로 변경
    • 메소드를 나눠서 작성 → 총점 구하는 메소드, 평균 구하는 메소드 따로 작성!!
    • 추가적으로 들어오는 데이터를 넣는 식으로 구상 필요
    • 평균을 구하는 변수 추가
    • private으로 할 경우, 원래의 값에 개입하는 것 불가능, 메소드에서 입력하는 방식으로 수정 필요
    • 새로운 과목들이 추가되는 것에 대비하여 메소드가 유연하게 작동하는 것 필요
package com.week1;

public class Cal {
	void sungjukCalculator(Sungjuk sungjuk) {       //성적을 계산해주는 메소드
		System.out.println("이름 : " + (sungjuk.name) + " / 점수 합계 = " + (sungjuk.scoreH + sungjuk.scoreC + sungjuk.scoreJ) + "점" + " / 점수 평균 = " + (sungjuk.scoreH + sungjuk.scoreC + sungjuk.scoreJ)/3+ "점");  
	}
	public static void main(String[] args) {
		Sungjuk sungjuk = new Sungjuk();             //성적을 인스턴스화
		Cal cal =new Cal();                              //메소드를 인스턴스화
		sungjuk = new Sungjuk();                     //나신입을 생성, 초기화
		sungjuk.name = "나신입"; 
		sungjuk.scoreH = 75;
		sungjuk.scoreC = 80;
		sungjuk.scoreJ = 90;
		cal.sungjukCalculator(sungjuk);              //메소드 활용
		sungjuk = new Sungjuk();                     //나일등을 생성, 초기화
		sungjuk.name = "나일등"; 
		sungjuk.scoreH = 10;
		sungjuk.scoreC = 20;
		sungjuk.scoreJ = 30;
		cal.sungjukCalculator(sungjuk);              //홍길동을 생성, 초기화
		sungjuk = new Sungjuk();                     //메소드 활용
		sungjuk.name = "홍길동"; 
		sungjuk.scoreH = 20;
		sungjuk.scoreC = 10;
		sungjuk.scoreJ = 80;
		cal.sungjukCalculator(sungjuk);              //메소드 활용
	}
}

/*
이름 : 나신입 / 점수 합계 = 245.0점 / 점수 평균 = 81점
이름 : 나일등 / 점수 합계 = 60.0점 / 점수 평균 = 20점
이름 : 홍길동 / 점수 합계 = 110.0점 / 점수 평균 = 36점
*/

0개의 댓글