[LG 유레카] 배열, 속성
배열 점검하기
[문제]
배열을 이용하여 사람의 이름을 저장, 삭제, 수정, 검색하는 클래스를 작성하시오.
-
최대 5명의 이름을 입력
String [] names = new String[5]
-
저장된 이름은 서로 겹치지 않는다는 가정
[결과]
<이름메뉴>
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 1
이름입력: 홍길동
<이름메뉴>
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 1
이름입력: 길라임
<이름메뉴>
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 1
이름입력: 김주원
<이름메뉴>
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 2
이름목록
홍길동
길라임
김주원
<이름메뉴>
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 3
기존이름입력: 길라임
변경이름입력: 차라임
<이름메뉴>
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 2
이름목록
홍길동
차라임
김주원
<이름메뉴>
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 4
삭제이름입력: 홍길동
<이름메뉴>
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 2
이름목록
차라임
김주원
이름메뉴
1.추가 2.검색 3.수정 4.삭제 5.종료
번호입력 ==> 5
-- END --이름메뉴>이름메뉴>이름메뉴>이름메뉴>이름메뉴>이름메뉴>이름메뉴>이름메뉴>-
[클래스 작성]
-
NameMenu.java
이름에 대한 추가, 검색, 수정, 삭제 기능 메소드를 정의
-
멤버변수(필드): 배열객체(String names[])
-
멤버 메소드)
-
추가(): add/addName/append/create/insert
- names[0]가 비었는지 확인하는 경우
- names[0] == null ⭕
- names[0].equals(null) ❌
- names[0]가 비었는지 확인하는 경우
-
검색()
-
수정()
-
삭제()
-
names[0]가 “홍길동”인지 체크
names[0]==delName ❌
names[0].equals(delName)
-
-
-
-
NameMenuTest.java
- main()포함
- 반복되는 메뉴 출력
- 번호입력(1~5), 추가 수정 삭제에 필요한 이름 입력
- main()포함
-
-
[답안]
-
내 답안
-
선생님 답안
NameMenu.java
NameMenuTest.java
cmd 창에서 java class 파일 실행
자바 파일이있는 주소로 이동합니다.
여기서 실행되는 것은 아니고 현재 컴파일이 완료되어 class 파일을 실행 시켜야한다.
실행은 bin
안에 존재합니다.
` cd ..을 통해 이전 폴더로 이동할 수 있는데 이렇게
bin`까지 도달한다.
bin에 com안에있는 ureca 패키지 안에있는 NameMenuTest.class를 실행시키고 싶은거니까
java com.ureca.NameMenuTest
를 써줍니다. class는 생략가능하다.
자바의 특징
-
OOP(Object Oriented Programming)
-
코드의 재 사용성이 뛰어남 ➡ 객체 지향언어
새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성 가능합니다.
-
코드의 관리가 쉬워짐
코드간의 관계를 맺어줌으로써 보다 적은 노력으로 변경이 가능
-
신뢰성이 높은 프로그램의 개발을 기능
제어자와 메소드를 이용해서 데이터를 보호하고, 코드의 중복을 제거하여 코드의 불일치로 인한 오류를 방지
-
유지보수에 용이
-
-
Simple & Easy
-
클래스 상속은 단일 상속만 지원
-
포인터를 지원하지 않음
➡ 직접적으로 메모리 접근 ❌
-
-
Garbage Collector
- Heap 메모리 영역의 객체들을 정리
- Heap메모리는 프로그램에서 동적으로 할당된 메모리를 관리하는데 사용되는 영역
- Heap 메모리 영역의 객체들을 정리
-
Datavase Independent(JDBC)
- JDBC interface를 이용하면 DB에 독립적
-
Multi-Threading
객체 생성
하나만 만들어서 변경없이 사용할 때 : static
여러객체를 만들어 사용할 때: new
-
메모리 할당
-
클래스 내의 멤버(필드, 메서드)에 대한 메모리적재(실제 존재)
-
클래스 내의 멤버와 메서드를 사용할 준비
class A{ int su=100; void hello(){ } }
A a = new A();
class My(){
//void hello(){
//void hello(int coin){
//void hello(A a){
void hello(Parent p){
}
}
class MyTest{
public void main(String [] args){
int su=100;
A a = new A();
My my = new My();
my.hello();
my.hello(1000);
int i=1000;
my.hello(i);
my.hello(new A());
my.hello)(a);
my.hello(new Parent());
my.hello(new Child());
}
}
객체지향의 특징
- 캡슐화
- 정보은닉
- 모듈성
- 상속 ⭐
- 부모가 갖는 자원(필드, 메소드)을 아낌없이 물려주는 것
- extends
- 단일 상속이 기본원칙
- 다형성
- 메소드 오버라이딩(MethodOverriding)⭐⭐
- 메소드 오버로딩(MethodOverloading)
캡슐화
캡슐화란?
클래스에 필드와 메소드를 묶어주는 것
- 특징
- 정보은닉
- 모듈성
class My{
public 감기약(){
기침_sol();
열_sol();
가래_sol();
}
private 기침_sol(){
}
private 열_sol(){
}
pritvate 가래_sol(){
}
}
=====================
My m = new My();
m.감기약
상속⭐
-
부모가 갖는 자원(필드, 메소드)을 자식클래스에게 물려주는 것
- 자식클래스는 부모클래스의 멤버들을 내 것 처럼 사용 가능
-
관련 키워드 extends
-
단일 상속이 원칙
API문서(Application Programming Interface)
java.lang.Object 상위, super, 부모클래스
↳java.lang.String 하위,sub, 자식클래스※ Object클래스
- 최상위 클래스
- 자바의 모든 클래스의 부모클래스
- 사용자가 정의하는 클래스에도 자동 추가 extends Object
class Parent{
void hello(){
}
}
class Child extends Parent{
//is a 관계
//자식은 부모다
//자식은 부모로 형변환이 가능
}
public static void main(String [] args){
Child c = new Child();
c.hello(); //실행된다. Child클래스에서 extends Parent했기 때문이다.
}
Parent p1;//생성
p1 = new Parent();//선언
Child c1 = new Child();
==============================
Parent p2;
p2 = c1;
➡ ⭕
Child c2;
c2=p1;
➡ ❌
왼쪽에 부모가 오고 오른쪽에 자식이 오면 무조건 컴파일 된다.
반대의 경우는 되는 경우가 있고 안되는 경우가 있어서 무조건적이지 않다.
Child c = new Child();
참조는 왼쪽, 할당은 오른쪽
c는 Child를 참조하고 new는 Child()를 할당한다.
상속간의 메모리할당과 참조변수
class Parent{
int su=300;
void hello(){
}
void hello(String name){
}//오버로딩메서드(Overloading)
void print(){
System.out.print("부모");
}
}
-
오버로딩메서드(Overloading)
인자를 다르게 한 같은 이름의 메서드
class Child extends Parent{
int sum=0;
void print(){
System.out.print("자식");
}
void goodBye(){
System.out,print("잘가");
}
}
-
오버라이딩메서드(Overloading)
부모에 있는 메서드를 재정의
부모클래스 객체생성
Parent p = new Parent();
-
Object 최상위 클래스를 기준
-
명시된 클래스까지 메모리 할당
Parent p = new Parent(); System.out.print(p.su); p.hello(); p.print(); //"부모"출력 p.goodBye(); //에러 > 부모 참조변수 p를 통해 자식 메서드 호출 불가능
여기서는 자식에 대한 메모리 할당이 없다.
-
사용할 수 있는 자원
su = 300;
,hello()
,print()
-
자식클래스 객체 생성
` Child c = new Child();`
-
Object 최상위클래스를 기준
-
명시된 클래스까지 메모리할당
Child c = new Child(); System.out.print(c.sum); c.goodBye(); c.print(); //"자식" 출력 c.hello(); //부모메서드 호출
-
부모메서드 호출
- 자식 참조변수 c를 통해 부모메서드 호출 가능
- 여기서는 부모에 대한 메모리 할당이 있다
-
사용할 수 있는 자원
Parent:
su=300
,hello()
,print()
Child:
sum=0
,goodBye()
,print()
-
자식클래스 객체생성(부모참조)⭐
Parent p2 = new Child();
-
Object 최상위 클래스를 기준
-
명시된 클래스까지 메모리할당
Parent p2 = new Child(); System.out.print(p2.su); p2.hello(); p2.print(); //"자식" 출력 p2.goodBye(); //에러
-
에러
부모 참조변수 p2를 통해 자식 메서드 호출 불가
Parent를 참조한다.
-
사용할 수 있는 자원
Parent:
su = 300
,hello()
,print()
❌Child:
sum=0
,goodBye()
,print()
⭕p2.print()
에서자식
이 출력되는 이유
부모 참조변수 p2를 통해 오버라이딩 메서드(Child.print())를 호출
-
자식클래스 객체생성(부모참조)
➡ 자식클래스 참조를 하고 싶을때
Parent p2 = new Child();
-
Object 최상위 클래스를 기준
-
명시된 클래스까지 메모리 할당
Parent p2 = new Child(); Child c3 = (Child)p2; System.out.print(c3.sum); c3.goodBye(); c3.print(); //"자식"출력
-
c3.print()
에서자식
이 출력되는 이유자식클래스로 형변환 했을때 자식메모리 사용가능(앞의 c참조변수 사용과 같다)
-
다형성
-
메소드 오버라이딩(MethodOverriding)⭐⭐
메소드를 재정의하는 것을 의미
- 상속에서 나온 개념
- 부모가 갖는 메소드를 자식클래스에서 재정의
-
메소드 오버로딩(MethodOverloading)
-
한 클래스내에 동일한 메소드를 여러개 구현
단, 인자의 갯수가 다르거나 자료형이 달라야 한다.
class Abc{ int su; My my; Abc( ){//기본생성자(매개변수 비어있는 생성자)---> 초기화(값할당) 메소드 //멤버필드에 대한 초기화 작업 su = 10; my = new My(); //(일반메소드 호출 전 1번 실행하는)선행작업 }//생성자 Abc(String name){//오버로딩 생성자 } ABc(int age){ //--->컴파일 에러발생: 클래스명과 일치하지 않으므로 일반메소드!! //---> 리턴자료형을 명시하지 않았음!! } void hello(){ } }//class Abc
-
상속을 활용한 다형성⭐
상속이란 클래스가 가지고 있는 멤버를 다른 클래스에 계승시키는 것
부모 클래스에 정의된 멤버 변수와 멤버 함수를 자식 클래스에서 재사용하여 중복을 줄인다.
- Parent p1 = new Parent();
- Parent p2 = new Child();
- Child c1 = new Child();
- Child c2 = new Parent();
-
Parent p1 = new Parent();
Parent 클래스의 멤버변수와 멤버함수에 접근가능
-
Parent p2 = new Child();
- child 클래스의 인스턴스를 생성
- 이 인스턴스를 Parent 타입의 변수 p2에 할당
이 경우 업캐스팅Up-casting이 발생.
-
업캐스팅Up-casting
객체지향 프로그래밍에서 서브 클래스의 인스턴스를 슈퍼 클래스의 타입으로 변환하는 것
위 사진을 보면, Vector<>나 ArrayList<>가 main()에서 List<>로 변환하는 것을 볼 수 있다.
출처: [순간을 소중히]https://velog.io/@shines/using-polymorphism-through-inheritance-and-implementation
JVM의 메모리 구조를 살펴보겠습니다.
자식 클래스 설계도에 따라 생성된 실제 객체는 힙
heap
영역 부모 클래스 설계도에 따라 생성된 변수는 스택stack
영역∴ 부모 클래스형 변수는 자식 클래스에만 있는 멤버변수나 멤버함수를 알 수 없다.
-
Child c1 = new Child();
1번과 마찬가지로 Child 클래스의 멤버변수와 멤버함수에 접근가능
-
Child c2 = new Parent();
컴파일 에러 발생
기본 자료형 | Wrapper클래스(기능확장) |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
댓글남기기