Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

어? 이게 되네

2022.04.05. 화요일 이공계 전문기술 연수사업 7일차 본문

TIL

2022.04.05. 화요일 이공계 전문기술 연수사업 7일차

토끼귀에진주귀걸이 2022. 4. 5. 17:54

오늘 배운 것

메소드의 중복( Method Overloading)
생성자를 중복할 수 있는 것처럼
같은 이름의 메소드를 여러 개 중복할 수 있는 것.

메소드의 중복이 되기 위해서는
매개변수의 개수가 다르거나 자료형이 달라야 함.

------------------------------------------------------------------------
클래스 변수와 클래스 메소드 (static 변수와 static 메소드 혹은 정적 변수와 정적 메소드)

클래스 변수
ㄴ멤버 변수명 앞에 static 키워드가 붙어있는 변수
객체와 무관하게 사용할 수 있으며 또, 모든 객체가 공동으로 사용할 수 있음.

클래스 메소드
ㄴ메소드 명 앞에 static 키워드가 붙어 있는 메소드를 말하며
객체와 무관하게 호출할 수 있는 메소드를 말함.

클래스 변수와  클래스 메소드는 객체와 무관하게 사용할 수 있기 때문에
클래스 이름으로 접근함.

주의 사항: static 메소드는 객체와 무관하게 (객체 없이도) 호출할 수 있는 메소드임.
하지만 일반 멤버들은 객체를 생성해야만 메모리가 잡힘.
객체 없이도 호출할 수 있는 메모리 안에서
객체를 생성해야지만 메모리가 잡히는 멤버는 호출할 수 없음


즉, static메소드(클래스 메소드)안에서는 static멤버(클래스 멤버,클래스 변수)만 접근할 수 있음.

--------------------------------------------------------------------------
프로그램을 실행하면 메모리 공간이 생김.
메소드 영역/스택 영역/힙 영역
프로그램을 실행시키면 클래스 변수가 메소드 영역에 먼저 할당 됨.(exam03의 Plane.planes)
동시에 그 변수가 0으로 초기화 됨.

그리고 프로그램을 메인서부터 출발함.
Plane p1=new Plane();
new라는 연산자를 만나서 heap에 할당됨
=>해당 생성자로 가서 변수(멤버)를를 봄
=>company,model,maxNum 세트로 메모리가 힙 영역에 할당됨.
예를 들어 힙 영역에 세트로 할당된 메모리를 1000번지라고 하면

스택영역에 p1이 할당되어 1000번지를 가르킴.

맨 마지막 생성자에서 planes가 1씩 추가하니 메소드에서 planes가 1이 됨.

p2,p3,p4도 마찬가지임~~

--------------------------------------------------------------------------
메소드 호출 방법 - 값에 의한 호출, 참조에 의한 호출

값에 의한 호출(Call by Value)
ㄴ메소드 호출 시에 기본 자료형이 전달되는 것.
메소드 안에서 전달된 값이 변경되더라도 호출하는 쪽에는 변경된 내용이 적용되지 않음.

=>왜?(exam04참고)
프로그램을 실행시키면 main부터 출발함.
main안의 변수 age가 스택에 메모리가 할당 되고 그 안에 28이라는 값을 저장함.
그 다음은 plusOne이라는 메소드를 호출함. age라는 변수가 입력받기 때문에 
28이 plusOne이라는 메소드에 전달 되고 그 값을 복사해서 n이라는 변수에 저장함.
또 n+1이 처리되기 때문에 29가 스택에 저장되지만
스택 아래에 쌓여있는 age가 28이기 때문에 28이 출력되는 것임.
메소드와 메인에서의 메모리는 별도의 공간이라서 변경된 내용이 적용되지 않음!!
(n과 age는 서로 다른 메모리 공간에 있음)

참조에 의한 호출(Call by Reference)
ㄴ메소드 호출 시에 참조자료형(객체나 배열)이 전달되는 것.
메소드 안에서 전달된 값이 변경될 때 호출하는 쪽에서 변경된 내용이 적용됨.

=>왜?(exam04참고)
역시 프로그램은 main부터 출발함.
배열(int []arr)이 힙 영역에 메모리가 할당됨
arr이 시작하는 주소를 1000번지라고 가정하자.
그 주소 1000번지가 스택 영역에 저장됨.
스택에 저장된 arr은 (주소를 가르키고 있는 변수) 참조변수라고 함.
그 다음 plusOne이라는 메소드가 호출됨
여기서 arr은 값을 가르키는 것이 아니라 1000번지를 가르키게 됨
그 메소드의 정의로 가서 data를 입력받으니 그 data도 1000번지를 가르키게 되고 스택에 저장됨.
(주소를 반환함)
그 다음 i가 스택에 0으로 저장됨.
i가 스택에서 1씩 증가하면서 데이터도 차례대로 1씩 증가됨.
for 탈출할 때 return된 i=5임.

=>왜?(exam04 test02참고)
main부터 시작함.
객체 생성했기 때문에 그 객체는 heap영역에 name,age가 한 세트(Person)로 할당됨
그 힙 영역 주소를 1000번지라 해보자.
그러면 그 kim이라는 변수가 1000번지를 가르키게 됨
즉, kim이라는 변수는 값을 가지고 있는게 아니라 값이 있는 메모리를 가르킴. 그걸 참조변수라고 함!!!(객체나 배열이 그럼)
그럼 스택에 kim이라는 변수가 1000번지를 저장하면서 heap영역에 있는 그 세트와 연결됨
그 다음 plusOne으로 가서 입력받는 Person자료형 변수 p와 kim이 동일한 객체를 참조하고 있음.
(동일하게 그 힙 영역과 연결되고 있음)
그래서 메소드 호출 한 후에도 kim의 age가 +1한 29가 됨.

참조자료형은 값을 갖는게 아니라 값을 갖는 메모리를 참조하고 있는 것!

------------------------------------------------------------------------------
클래스의 상속
ㄴ이미 만들어진 클래스를 확장하여 새로운 클래스를 만들 수 있음.
그러면 코드의 재사용성을 만들 수 있음.

상속하기 위해서는 extends 키워드를 사용함.

상속을 해 준 클래스를 부모클래스라고 하고
상속을 받은 클래스를 자식클래스라고 함.

class A{

}//A는부모클래스

class B extends A{

}//B는 자식클래스

B는 A안에 있는 모든 속성과 동작을 물려받음.(A를 사용하고 확장해서 B를 만들겠다는 의미)
새로 추가하려는 속성이나 동작에 대해서만 코딩하면 됨.

자식클래스의 속성 중에 부모클래스에게 물려받은 속성은 부모클래스가 생성자를 초기화해야 함.
부모의 생성자를 요구하는 super();는 반드시 첫 번 째 줄에 와야함.

----------------------------------------------------------------------------
protected
ㄴ상속관계에 있을 때에 아무리 자식클래스라 할지라도 부모클래스의 private 영역에는
접근할 수 없음.
그래서 외부의 다른 클래스로부터는 보호하되
상속한 자식클래스들에게는 접근을 허용하기 위해서 protected를 사용함.

------------------------------------------------------------------------------
생성자
ㄴ객체가 생성 시에 자동으로 수행됨.

상속과 생성자
ㄴ상속 관계에 있을 때 자식의 객체를 생성하면
부모의 생성자가 먼저 동작하고 그 다음 자식의 생성자가 동작함

ㄴ부모의 생성자를 요구하기 위해서는 super()를 사용함.
이 때 반드시 생성자의 첫 번 째 문장에 와야함.

ㄴ상속 관계에 있을 때, 부모 클래스, 자식 클래스 모두
기본 생성자가 제공되어 자식 클래스 생성 시에 자동으로 부모의 기본 생성자가 요구되어
객체를 생성할 수 있음.

ㄴ만약 부모 클래스에 매개변수를 갖는 생성자를 만들고
따로 기본 생성자를 만들지 않고 자식 클래스에도 생성자를 만들지 않은 상태에서
자식 클래스의 객체를 생성하게 되면 부모의 기본 생성자를 요구하기 때문에 오류가 발생함.

ㄴ문제를 해결하기 위해서는 부모 클래스에 기본 생성자를 만들어주거나
자식 클래스의 생성자에서 super(부모의 매개변수)를 사용하여 부모의 매개변수를 갖는 생성자를 요구하도록 함.

------------------------------------------------------------------------------
메소드 오버라이딩
ㄴ상속관계에 있을 때 부모 클래스의 메소드가 자식 클래스에는 맞지 않아 다시 정의(재정의)하는 것.

메소드 오버라이딩은 메소드 이름 뿐아니라 매개변수의 개수와 자료형까지 일치되게 재정의해야 함.

------------------------------------------------------------------------------
메소드 오버로딩 vs 메소드 오버라이딩

메소드 오버로딩은 동일한 이름의 메소드를 매개변수의 개수나 자료형을 다르게 정의해서 중복하여 사용하는 것.
메소드 오버라이딩은 부모 클래스에서 상속받은 메소드를 자식 클래스에 맞게 재정의하는 것.

------------------------------------------------------------------------------
자바의 모든 클래스들은 Object 클래스의 자식 클래스임.
자바가 제공하는 모든 클래스들의 제일 조상 클래스는 Object 클래스임.
또 우리가 만드는 모든 클래스들도 묵시적(자동)으로 Object 클래스의 후손 클래스임.

----------------------------------------------------------------------------
질문) equals에 기본자료형은 못 넣나요?
답) 만약 equals에 기본 자료형을 넣게 되면 그것은 오버라이딩이 아닙니다.
오버라이딩은 메소드 이름 뿐만 아니라 매개변수의 개수와 자료형까지 일치되게 재정의 하는 것을 말합니다.

------------------------------------------------------------------------------
toString()과 equals()
ㄴ자바의 제일 조상인 Object의 메소드이며
필요하다면 자신의 클래스에 맞도록 재정의하여 사용함.

만약, 출력문에 객체를 표현하고자 한다면 toString()을 오버라이딩하고
만약, 두 개의 객체가 서로 동일한 속성 값을 갖고 있는지 판별하려면 equals()메소드를 재정의하여 사용함.

 

-------------------------------------------------------------------------------------------------------------------

패키지 이름은 소문자로 시작하게 하고

클래스 이름만 대문자로 시작하게 하자!(나중에 자바가 헷갈릴 수도 있음)

 

오늘 헷갈린 것

  • 대입 연산자 = 에서 왼쪽과 오른쪽이 오는 규칙...?
  • 객체생성과 기본생성자 => 
  • exam01 SistUtil 배열 최댓값 오류나는 이유..?
  • 용어 - 접근명시자(private)
  • private로 접근명시자로 되어있으면 같은 패키지 내 다른 클래스에서는 setter getter로 그 변수를 접근해야함.
  • 클래스변수, 클래스 메소드
  • 객체생성과 동시에 바로 값 입력 vs setter Plane p1=new Plane("대한항공","g343",600) => 알 것 같음! 매개변수 없으면 모두 setter로 해야하고 매개변수 있으면 해당 매개변수를 객체 생성과 동시에 바로 값을 입력할 수 있음!
  • 자주 쓰이는 것을 메소드로 정의해서 쓰면 편해서 메소드를 정의하는 건가...?
  • 배열의 정의가 원래 참조변수(값이 아닌 주소를 가르키는 변수)인건가..?
  • 참조에 의한 호출 이해가 잘 안 감... - 그림그려서 다시 생각해보기
  • p++;랑 p+=1;이거의 차이
  • b1.equals(b2)이거 코드 만든거 다시 이해하기!(exam11 참고)
  • exam11 EqualsTest 주석 친 거 다시 강사님께 여쭤보기!! b1.pro()랑 b1.pro(b2) 차이 - 이거 약간 이해함!
  • toString()이 자동으로 동작하는 이유

오늘 한 생각

 

이클립스랑 깃헙 연동해서 잔디심기 시작하기!!(수업시간 코드)

매 주말마다 자바 포스팅 시작하기