20210928 오랜만에 학원

DUUUPPAAN·2021년 9월 28일
0

교육 20210915~ Java

목록 보기
9/13

·오랜만에 등원

-그동안 학원에 등원하기 어려운 환경이었다. 백신접종으로 인해서 못 갔고, 또 여자친구가 병원에서 일하는데, 요즘 부쩍 늘어난 코로나 환자들로 인해, 코로나 환자가 병원에 다녀간 경우가 많았고, 그렇게 되면 여자친구의 코로나 검사 결과가 나오기 전까지 등원하기가 어려워졌다. 또한 결정적으로, 학원-집 두 곳에서 코딩을 하게 되면, 작성중이던 코드를 계속 백업해서 학원으로 또 학원에서 집으로 이동시켜줘야 했다. 그냥 넘어가는 코드면 모르겠는데, 다음날 수업에 필요한 경우가 많아서 꽤나 불편했다. 그래서 그동안은 학원을 좀 안가게 되었는데 오랜만에 학원에 갔다. 역시 집중력이 차이가 나긴 했다. 아무래도 환경 자체가 집은 집중을 저해하는 요소가 많긴 한 것 같다. 앞으로는 조금 등원에 신경써야겠다.

·교과서 위주의 복습

-기존에는 교수님이 따로 더 쉽고 간결하고 가시적인 예들을 사용해서 수업을 진행하셨다. 왜냐하면 교재에 있는 많은 예들이, 아직 배우지 못한 기능들이나, 개념들을 포함하고 있는 경우가 많아서 더 간결한 예들로 진행하셨다. 그러나, 어쨌든 교재의 진행을 따라서 수업을 해야하기 때문에 그동안 진행했던 부분의 교재를 같이 살펴보며 복습했다.

·수업 전에 만들었던 점수 관련 코드

-기존에 자주 만들어봤던, 이름 국어점수 수학점수 영어점수를 입력받아서 합계와 평균을 구하고 평균 점수에 따라 학점을 부여하는 코드를 자바에서 만들어봤다. 물론 이 부분은 교과서에도 나오지 않았고, 교수님이 만들어보라고 하셨는데, 나중에 교수님이 만들어서 보여주신 것보다 나름 잘 만들었다.

package Sungjuk;

public class Print {
	//합계를 구하는 메소드
	public int total(int kor, int mat, int eng) {
		int total = kor+mat+eng;
		return total;
	}
	//평균을 구하는 메소드
	public int avg(int total) {
		int avg = total/3;
		return avg;
	}
	//전부 출력하는 메소드
	public void show(String name, int kor, int mat, int eng, int total, int avg) {
		System.out.println("이름은 "+name+"이고, 국어 수학 영어 점수는 각각 "+kor+" "+mat+" "+eng+"이며 합계는 "+total+"이고 평균은 "+avg+"입니다." );
	}
	//평균을 비교해 학점을 주고 출력하는 메소드
	public String grade(int avg) {
		String grade ="";
		if(avg>90) {
			grade="A";
		}
		else if(avg>80 && avg<=90) {
			grade="B";
		}
		else if(avg>70 && avg<=80) {
			grade="C";
		}
		else {
			grade="F";
		}
		System.out.println("당신의 학점은 "+grade+"입니다.");
		return grade;
	}
}
package Sungjuk;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
	Scanner sc = new Scanner(System.in);
	System.out.println("이름: ");
	String name = sc.next();
	System.out.println("국어: ");
	int kor	= sc.nextInt();
	System.out.println("수학: ");
	int mat	= sc.nextInt();
	System.out.println("영어: ");
	int eng	= sc.nextInt();
	
	
	Print pt = new Print();
	int total= pt.total(kor, mat, eng);
	int avg= pt.avg(total);
	pt.show(name, kor, mat, eng, total, avg);
	
	String grade=pt.grade(avg);
	}

}

다음에는 더 Main의 양을 줄여보려고 노력해봐야겠다.

·상속된 클래스를 또 다시 상속

-지금까지 상속에 대한 내용은 배웠지만, 상속된 클래스를 또 다시 상속하는 내용에 대해서는 배우지 않았다. 대략 이렇게 되겠다는 생각만 있지, 확실하지는 않았기에 교재의 코드를 따라해봤다.

예를 들어,
Class a가 있고
Class b가 Class a를 상속하고
Class c가 Class b를 다시 상속하고 있을 때,
Class c는 Class a와 b의 모든 변수와 메소드를 사용할 수 있었다. 자손이 조상의 물건들을 쓸 수 있다는 것을 생각해보면 당연하다. 그래도 할 수 있다는 것을 아는 것은 중요하기 때문에 정말 따라해보길 잘했다는 생각을 했다.

·오버라이딩

-오버라이딩을 전날 배웠는데, 성립할 수 없는 규칙에 대해 주의깊게 보지 않았다.
왜냐하면 아직 배우지 못한 것들에 대한 내용이 있었기 때문에 단순하게
오버라이딩은 자식 클래스에서 부모클래스의 메소드를 재정의 하는 것이고, 재정의 시 메소드 이름과 리턴 타입, 파라미터가 변화하면 안된다고만 살펴봤다.
성립할 수 없는 규칙들은 다음과 같다.(아직 배우지 못한 내용이 있어서 밑에 있는 것이 전부인 것은 아니다.)
1.static method는 애초에 클래스에 속하는 메소드이기 때문에 상속 자체가 안된다. 상속이 성립되지 않으면 오버라이딩도 불가능하다.
2. 부모 클래스의 접근제한자보다 더 좁아질 수 없다.
3. final 예약어가 지정된 메소드는 오버라이딩할 수 없다.

여기서 2,3의 내용을 정확하게 배우지 않았기 때문에 위의 2,3번 내용을 어제는 정리하지 못했다.

·접근 제한자

-전에 public에 대해 궁금했던 적이 있었다 왜냐하면, java를 처음 만났을 때 접했던 문장이 public static void main... 이었기 때문이다. 그 public이 뭔지 오늘 확실하게 깨달았다.

public은 접근제한자 중 하나다.
접근 제한자는 다음과 같은 네 개가 있다.
private를 사용해본 적이 있다. private는 캡슐화를 생각하면 된다. 애초에 해당 클래스에서밖에 사용할 수 없고, 외부에서 사용하려면 getXXX나 setXXX 메소드를 사용해서 불러와야 했다. 즉, 외부에는 접근이 힘들다고 생각하면 된다.

private: 해당 class

default(디폴트 값은 기본값, 여기서는 아무것도 지정하지 않은 경우): 같은 패키지 내에서 접근 가능

protected: 같은 패키지 내에서도 접근 가능, 타 패키지의 클래스라도 자식 클래스에서 상속받아서 사용한다면 접근 가능.

public: 모든 영역에서 접근 가능.

이 접근제한자에 대한 예시는 교재에 엄청나게 자잘하게 있는데, 굳이 여러개로 나누지 않고 싶어서 나중에 파일을 합쳐서 스스로 재작성해봤다.

우선 test1 패키지에 모든 접근제한자를 사용해서 변수를 만든다.

package test1;

public class AllData {
	private int privateVar = 10;
	int defaultVar = 20;
	protected int protectedVar = 30;
	public int publicVar = 40;
}

test1 패키지, 즉 같은 패키지의 다른 클래스에서 변수 불러오기.

package test1;

public class DataAccessSameClass {

	public static void main(String[] args) {
	
	/* private 변수를 다른 클래스에서 불러오기
	 * 불가능함. 주석처리 빼면 컴파일 오류.
	AllData privateAd1 = new AllData();
	System.out.println("privateAd1.privateVar= "+privateAd1.privateVar);
	*/
	
	AllData Ad2 = new AllData();
	//접근제한자를 설정하지 않은 변수, 즉 default값을 가진 변수를 타 클래스에서 불러오기.
	System.out.println("Ad2.defaultVar= "+Ad2.defaultVar);
	//접근제한자를 protected로 설정한 변수. 동일 package내의 타 클래스에서는 객체로 불러와서 사용 가능.
	System.out.println("Ad2.protectedVar= "+Ad2.protectedVar);
	//접근제한자가 public인 변수. 당연히 동일 package의 타 클래스에서 접근 가능.
	System.out.println("Ad2.publicVar= "+Ad2.publicVar);
	}

}

private 빼고는 전부 가능했다.

test2 다른 패키지에서 접근

package test2;
import test1.AllData;
public class DataAccessElsePackageProtected extends AllData {

	public static void main(String[] args) {
	DataAccessElsePackageProtected ad4 = new DataAccessElsePackageProtected();
	System.out.println("ad4.protectedVar= "+ad4.protectedVar);	
	}

}

원래는 public과 protected를 같은 공간에서 비교하려 했는데, 애초에 하나는 상속이 필요하고 하나는 필요가 없기에 파일을 나눠야 좀 더 비교가 잘 될 것 같아서 부득이하게 나눴다.

package test2;
import test1.AllData;
public class DataAccessElsePackage {
	
	public static void main(String[] args) {
	//private와 default는 애초에 타 패키지의 클래스에서 불러올 수 없는 변수들임.
	AllData ad3 = new AllData();
	System.out.println("ad3.publicVar= "+ad3.publicVar);
	//여기서 바로 위의 클래스를 상속시켜서 protected를 불러올 수 있지만 그러면 public과의 차이가 가시적이지 않기 때문에 따로 클래스를 만들겠다.
	}

}

여기서 주의해야 할 점은, 기본적으로 다른 패키지라면, import가 필요하다.

·final 예약어

-final 예약어는 정말 쉬웠다. 그냥 단순하게 생각해서 final을 붙인 모든 것들은 최종결과가 된다. 최종결과라는 뜻은 그게 마지막 결과이기 때문에, 더이상 수정이나 변경이 불가능하다는 것이다.

수업에서는 다음과 같이 정리했다.

final => 3 "NO"

  1. final 변수 -> 수정 불가
  2. final class -> 상속 불가
  3. final method -> 오버라이딩 불가(자식클래스에서 메소드 재정의 불가)

final은 보통 상수를 정의할 때 변수 앞에 자주 사용한다고 한다.

·그 밖에

-this와 this()/ super와 super() 등등을 배웠다. 하지만 this와 super()는 자주 사용해봤고, this()는 깊게 다루지 않았다. super는 자식 클래스에서 사용하는 부분인데, this.의 경우를 super.으로 바꿔서 부모클래스의 것을 사용할 수 있는 기능이다.

·집과 다른 것, 마스크

-학원에서 오래 공부를 하면, 마스크로 인해 안경이 좀 떠서 두통이 좀 생긴다. 그래서 집에서 하면 두통이 없는데 학원에서 공부를 하면 항상 두통이 조금씩 생기는 것 같다. 하루 빨리 코로나가 좀 없어졌으면 싶다. 그래도 오늘은 정리도 잘 하고 코드도 혼자 잘 짜고, 궁금증도 혼자 한 나머지 공부로 인해 잘 해결했다. 개인적으로 참 뿌듯한 하루였다.

profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글