먼저 숙제 문제 풀이를 진행하면서 abstract에 대해서 배웠다. abstract는 부모 클래스의 메서드에 어떤 기능을 작성할 수 없게끔 강제하는 코드이다. 강사님은 부모 클래스에서 어떤 기능을 작성한다는 것은 의미가 없는 행동이라고 하셨는데 대게 자식 클래스에서 오버라이딩하기 때문에 그런 것 같다. abstract를 사용한 코드 예제를 보자.
class 땡땡 {
abstract void 땡땡 (); //abstract 사용.
}
interface 땡땡 {
void 땡땡 (); // abstract는 생략됨
}
class 땅땅 implements 땡땡 { //interface에게 상속받으려면 extends가 아니고 implements로 상속함.
//implements는 다중상속이 가능하다.(어차피 오버라이드 해야하기 때문에 애매한 상황이 없다.)
}
보면 interface와 implements가 있는데 예제 코드 안에 각주로 몇가지 써져있다. interface는 abstract void만 클래스안에 존재할 때 class로 명명하는 것이 아닌 interface로 사용할 수 있고, absract는 생략하고 void만 쓸 수 있다.
아무튼 이런 개념을 배웠고 수업중 풀었던 문제중 중요한 것만 올려보면,
class Main2 {
public static void main(String[] args) {
전사 a전사 = new 전사();
String 이름 = "칸";
a전사.이름 = 이름;
a전사.나이 = 20;
a전사.자기소개();
a전사.이름 = "뷁";
a전사.나이++;
a전사.자기소개();
a전사.나이 = 30;
a전사.이름 = "카니";
a전사.자기소개();
a전사.a무기 = new 활();
a전사.공격();
// 출력 : 카니가 활로 공격합니다.
a전사.a무기 = new 칼();
a전사.공격();
// 출력 : 카니가 칼로 공격합니다.
}
}
class 전사 {
String 이름;
int 나이;
무기 a무기;
void 자기소개() {
System.out.println("안녕하세요. 저는 " + this.나이 + "살 " + this.이름 + " 입니다.");
}
public void 공격() {
a무기.작동(this.이름);
}
}
class 무기 {
void 작동(String 공격자이름) {
}
}
class 칼 extends 무기 {
void 작동(String 공격자이름) {
System.out.println(공격자이름 + "가 칼로 공격합니다.");
}
}
class 활 extends 무기 {
void 작동(String 공격자이름) {
System.out.println(공격자이름 + "가 활로 공격합니다.");
}
}
여기가 매개변수를 활용해서 전사의 자기 소개와 공격을 했을 때 어떤 전사가 어떤 무기로 공격을 하는지 출력해주는 코드고,
class 전사 {
String 이름;
int 나이;
무기 a무기;
void 자기소개() {
System.out.println("안녕하세요. 저는 " + this.나이 + "살 " + this.이름 + " 입니다.");
}
public void 공격() {
System.out.println(this.이름 + "(이)가 " + this.a무기 + "로 공격합니다.");
}
}
class 무기 {
}
class 칼 extends 무기 {
public String toString() {
return "칼"; //리턴 값을 "칼"을 갖도록 함.
}
}
class 활 extends 무기 {
public String toString() {
return "활";
}
}
이게 매개변수 없이 풀어보라고 하셔서 내가 풀어본 코드다.
// 문제 : 아래가 실행되도록 해주세요.
class Main2 {
public static void main(String[] args) {
전사 a전사 = new 전사();
String 이름 = "칸";
a전사.이름 = 이름;
a전사.나이 = 20;
a전사.자기소개();
a전사.이름 = "뷁";
a전사.나이++;
a전사.a무기 = new 칼();
a전사.자기소개();
a전사.공격();
a전사.나이 = 30;
a전사.이름 = "카니";
a전사.자기소개();
a전사.a무기 = new 활();
a전사.공격();
// 출력 : 카니가 활로 공격합니다.
a전사.a무기 = new 칼();
a전사.공격();
// 출력 : 카니가 칼로 공격합니다.
}
}
class 전사 {
String 이름;
int 나이;
무기 a무기;
void 자기소개() {
System.out.println("안녕하세요. 저는 " + this.나이 + "살 " + this.이름 + " 입니다.");
}
public void 공격() {
a무기.공격자명 = 이름;
a무기.작동();
}
}
class 무기 {
String 공격자명;
void 작동(){
}
}
class 칼 extends 무기 {
void 작동(){
System.out.println(공격자명 + "칼로 공격합니다.");
}
}
class 활 extends 무기 {
void 작동(){
System.out.println(공격자명 + "활로 공격합니다.");
}
}
이게 강사님 풀이다.
생성자에 대해서 배웠다.
- 생성자(constructor)
자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공한다.
자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 한다.
이러한 생성자는 다음과 같은 특징을 가진다.
- 생성자는 반환값(return)이 없지만, 반환 타입을 void형으로 선언하지 않는다.
- 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
- 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있다.
즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다는 의미다.
- 예제 코드
class Main2 {
public static void main(String[] args) {
사람 사람1 = new 사람("김철수", 22); //new가 생성자를 불러온다.
System.out.println("==사람1 정보==");
System.out.printf("이름 : %s\n", 사람1.이름);
System.out.printf("나이 : %d\n", 사람1.나이);
사람 사람2 = new 사람("김영희", 33);
System.out.println("==사람1 정보==");
System.out.printf("이름 : %s\n", 사람2.이름);
System.out.printf("나이 : %d\n", 사람2.나이);
}
}
class 사람{
String 이름;
int 나이;
사람 (String 이름, int 나이) { //매개변수 //생성자 new가 나올 때 바로 작동함.
this.이름 = 이름;
this.나이 = 나이;
}
}
이렇게 생성자 까지 배운 뒤에 Article을 클래스로 만들어서 설명하기 시작했다. 아마 내일이나 금요일부터는 게시판 구현하기를 슬슬 시작하지 않을까 싶다. Article을 예로 들면서 static에 대해서도 알려주셨다.
- 예제코드
class Main2 {
public static void main(String[] args) {
Article article1 = new Article();
System.out.println(article1.id);
Article article2 = new Article();
System.out.println(article2.id);
}
}
class Article {
static int lastId; //스태틱 변수는 공공재다.
int id;
String regDate;
static {
lastId = 0;
}
Article() {
lastId++;
this.id = lastId;
}
Article(int id, String regDate) {
this.id = id;
this.regDate = regDate;
}
}
대충 이런 코드였는데 static 변수는 공공재라는 말을 배웠다.
- static
스태틱은 클래스에 고정되어 있는 변수나 메서드다.
스태틱 메서드 안에서는 인스턴스 변수를 사용할 수 없다.
스태틱은 객체생성 없이 사용할 수 없다.
이렇다고 한다. 오늘은 숙제나 필수영상같은게 없었다. 내가 정리를 잘 못해서 그렇지 생각보다 많은 개념을 배웠고 이개념들을 좀 톺아보며 찬찬히 이해할 시간이 필요할 것 같다. 말을 덧붙여보자면 감각적으로는 이해가 되는데 상세한 설명이나 제대로 된 이해는 아직 안되는 것 같다. 그럼 뭐다? 이해하지 못했다는 것이다. 따라서 오늘은 이걸 좀 계속 볼 예정이다.
'Coding History' 카테고리의 다른 글
국비 지원 IT(웹앱개발) 취업반 강의 12일차 (0) | 2024.06.21 |
---|---|
국비 지원 IT(웹앱개발) 취업반 강의 11일차 (0) | 2024.06.20 |
국비 지원 IT(웹앱개발) 취업반 강의 9일차 (0) | 2024.06.18 |
2024. 06. 17 문제 풀이 (0) | 2024.06.18 |
국비 지원 IT(웹앱개발) 취업반 강의 8일차 (0) | 2024.06.17 |