오픈 소스 기반의 자바스크립트 라이브러리로 웹 사이트에 자바스크립트를 더욱 손쉽게 활용할 수 있게 해 주는 것. 또한, 제이쿼리를 사용하면 짧고 단순한 코드로도 웹 페이지에 다양한 효과나 연출을 적용할 수 있어서 제이쿼리는 오늘날 가장 인기 있는 자바스크립트 라이브러리 중 하나이다.
제이쿼리의 역사
제이쿼리는 2006년 미국의 존 레식(John Resig)이 뉴욕시 바캠프(Barcamp)에서 처음으로 소개하였다.
현재는 jQuery Team이라는 개발자 그룹이 jQuery Foundation을 통해 개발과 유지 보수를 담당하고 있다.
CDN을 사용한 jQuery 활용
jQuery 공식 홈페이지에서는 발표된 모든 버전의 jQuery 스크립트 CDN 서버를 제공하며 사용자는 jQuery CDN 서버로 연결되는 외부 링크만으로 jQuery 스크립트를 불러와서 제이쿼리의 모든 기능을 사용할 수 있다. 이 방법은 사이트 트래픽량을 감소시킬 수 있다. jQuery는 한 개의 스크립트로 이루어져 있음과 동시에 한 개의 jQuery() 함수로 구성되어 있다.
인터넷만 연결되어있으면 제이쿼리 라이브러리를 가져다 사용 가능하다. 여기에서는 구글 개발 라이브러리를 사용했다. 사용 방법은 매우 간단! 위의 코드를 긁어와서 html 헤더 부분에 복사 + 붙여넣기해서 사용하면 된다.
JavaScript는 객체(object) 기반의 스크립트 언어이다. 웹 브라우저 내에서 주로 사용하며, 다른 응용 프로그램의 내장 객체에도 접근할 수 있는 기능을 가지고 있다. HTML로는 웹의 틀을 작성하고, CSS로는 웹을 디자인하며, 자바스크립트로는 웹의 동작을 구현한다. 자바스크립트는 주로 웹 브라우저에서 사용되나, Node.js와 같은 프레임워크를 사용하면 서버 측 프로그래밍에서도 사용할 수 있다. 현재 컴퓨터나 스마트폰 등에 포함된 대부분의 웹 브라우저에는 자바스크립트 인터프리터가 내장되어 있다.
클라이언트
서버
html
JSP
JAva(빈)
css
html
javascript
JSON- 안드로이드, 애플, pc 다 됨
자바스크립트의 역사
자바스크립트는 1995년에 Netscape의 브렌던 아이크(Brendan Eich)에 의해 만들어졌다. 처음에는 Mocha라는 이름으로 개발되었으나 이후 LiveScript, 최종적으로는 JavaScript라는 이름으로 변경.
자바스크립트의 언어적 특징
1. 자바스크립트는 객체 기반의 스크립트 언어
2. 자바스크립트는 동적이며, 타입을 명시할 필요가 없는 인터프리터 언어
3. 자바스크립트는 객체 지향형 프로그래밍과 함수형 프로그래밍을 모두 표현할 수 있다.
자바스크립트로 할 수 있는 것
1. HTML의 '내용'을 변경
2. HTML의 '속성'을 변경
3. HTML의 '스타일'을 변경
자바스크립트 문법
자바스크립트의 실행문은 세미콜론(;)으로 구분되며 대소문자를 구분한다. 마찬가지로 리터럴은 작은 따옴표를 사용.
식별자
변수나 함수의 이름을 작성할 때 사용하는 이름. 식별자는 영문자(대소문자), 숫자, 언더스코어(_) 또는 달러($)만을 사용한다. 식별자는 숫자와 식별자의 구별을 빠르게 할 수 있도록 숫자로는 시작할 수 없으며 유니코드를 사용한다. 식별자는 다음 두 가지 방법으로 사용할 수 있는데 1번 방식을 많이 이용한다.
1. Camel Case 방식
2. Underscore Case 방식
주석(comment)
// 주석문
위와 같이 사용하며 여러 줄 주석은 절대로 중첩해서 사용해서는 안 됩니다. 중간에 끊길 수도 있는데 오류로 뜨지 않는 경우도 있기 때문.
자바스크립트에서 사용할 수 있는 출력 방법
1. window.alert() 메소드
자바스크립트에서 가장 간단하게 데이터를 출력할 수 있는 방법. 브라우저 위에 alert 대화상자(창)를 띄워 데이터를 전달한다.
2. HTML DOM 요소를 이용한 innerHTML 프로퍼티
가장 많이 사용되는 방법. getElementByID()나 getElementsByTagName() 등의 메소드를 사용하여 HTML 요소를 선택하고서 innerHTML 프로퍼티를 이용하면 선택된 HTML 요소의 내용(content)이나 속성(attribute)값 등을 손쉽게 변경할 수 있다.
3. document.write() 메소드
웹 페이지가 로딩될 때 실행되면, 웹 페이지에 가장 먼저 데이터를 출력한다. 대부분 테스트나 디버깅을 위해 사용된다. 웹 페이지의 모든 내용이 로딩된 후에 document.write() 메소드가 실행되면, 웹 페이지 내에 먼저 로딩된 모든 데이터를 지우고 자신의 데이터를 출력하게 되어 테스트 이외의 용도로 사용할 때에는 충분히 주의해서 사용해야 한다.
4. console.log() 메소드
웹 브라우저의 콘솔을 통해 데이터를 출력한다. 대부분의 주요 웹 브라우저에서는 F12를 누른 후, 메뉴에서 콘솔을 클릭하면 콘솔 화면을 사용할 수 있다.
HTML 문서에 자바스크립트 코드를 적용하는 방법
1. 내부 자바스크립트 코드로 적용 : 주로 body 태그 끝부분이나 head 태그에 삽입
GUI : Graphical User Interface. 이미지나 그래픽을 이용하여 화면을 구성하고 (키보드 등) 입력도구를 이용하여 편리하게 작성된 사용자 인터페이스다. 자바에서 GUI를 구성하는 기본 패키지는 AWT와 스윙이 있다.
AWT: 자바가 처음 나왔을 때 함께 배포된 GUI 라이브러리, 중량 컴포넌트로 native 운영체제의 gui 컴포넌트의 도움을 받아 작동. 운영체제에 부담을 주지만 처리속도는 빠름. java.awt 패키지에 있다.
SWING : 순수 자바 언어로 만들어진 라이브러리, 경량 컴포넌트. java.swing 패키지에 구현되어 있다. AWT컴포넌트 외 많은 고급 컴포넌트를 갖고 있다.
컨테이너 : 여러 컴포넌트를 포함할 수 있는 특별한 GUI 컴포넌트다. 내부에 반드시 하나의 배치관리자를 가진다. - AWT 컨테이너 : Panel, Frame, Applet, Dialog, Window - Swing 컨테이너 : JPanel, JFrame, JApplet, JDialog, JWindow
최상위컨테이너 : 다른 컨테이너에 속하지 않고 독립적으로 화면에 출력될 수 있는 컨테이너. JFrame, JDialog, JApplet
컴포넌트 : 컴포넌트 포함 불가. 컨테이너에 포함되어야 화면에 출력될 수 있는 GUI 객체. JComponent에는 스윙 컴포넌트의 공통적인 기능이 작성되어 있다.
System.exit(0); 응용프로그램 내에서 스스로 종료 main()종료 뒤에도 이벤트 분배 스레드가 살아 있어 프레임이 살아있다. 테스트 시 이 구문을 안쓰면 메모리에 계속 쌓이는 것을 볼 수 있음.* 종료했을때 메모리상에서도 사라지게 하기 : frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
배치관리자 : 컨테이너 내부에 있는 배치관리자 Layout Manager가 컨테이너에 부착되는 컴포넌트의 위치와 크기를 부착 시점에 결정해줌 - FlowLayout : 왼 -> 오로 적당한 크기로 배치 - BoderLayout : 가운데정렬되어 5개 영역의 크기에 맞추어 배열. 동서남북 - GridLayout : 2차원 격자로 나누고 셀의 크기와 동일하게 배열. 바둑판 - CardLayout : 겹쳐놓은 듯 배열. 잘 안씀
| 예제 9-6 | 컨텐트팬에 배치관리자를 삭제하고 9개의 버튼과 하나의 문자열을 출력하는 프로그램을 작성하라. "Hello, Press Buttons!" 문자열은 JLabel 컴포넌트를 이용하고, 그 위치를 130,50에 크기는 200*20으로 한다. 버튼의 크기는 50*20로 한다.
* 배치관리자 없는 컨테이너에 컴포넌트를 절대 위치와 크기로 지정
import javax.swing.*;
import java.awt.*;
public class NullContainerEx extends JFrame {
public NullContainerEx() {
setTitle("Null Container Sample");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(null);
JLabel la = new JLabel("Hello, Press Buttons!");
la.setLocation(130, 50);
la.setSize(200, 20);
c.add(la);
for(int i=1; i<=9; i++) {
JButton b = new JButton(Integer.toString(i)); // 버튼 생성
b.setLocation(i*15, i*15);
b.setSize(50, 20);
c.add(b); // 버튼을 컨텐트팬에 부착
}
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args) {
new NullContainerEx();
}
}
부모 클래스에서 만들어진 필드와 메소드를 자식 클래스가 물려받는 것. 상속의 선언은 extend 키워드와 함께 사용한다.
public class Person{}
public class Student extends Person{}
장점 : 같은 속성의 수정이 필요할 경우 부모 클래스만 수정하고 여러 개의 클래스를 모두 수정할 필요가 없어 유지보수가 쉽다.
--> 코드 중복을 제거하여 클래스를 간결하게 구현한다.
1. 클래스 간결화 - 멤버 중복작성 불필요
2. 클래스 관리 용이 - 클래스의 계층적 분류
3. 소프트웨어의 생산성 향상 - 클래스 재사용, 확장이 쉬움
상속의 특징
1. 자바에서는 클래스 다중 상속 (multiple inheritance)를 지원하지 않는다. (C++은 지원한다)
--- 다중상속은 부모 클래스들이 같은 이름의 함수를 가진 경우 모호성으로 문제 유발 가능성이 있다. 자바는 이를 원천봉쇄.
2. 상속의 횟수에 제한이 없다.
3. 계층 구조의 최상위에 java.lang.Object 클래스가 있어서 자동으로 상속받도록 컴파일된다.
--- Object 클래스만이 유일하게 슈퍼클래스를 가지지 않는다.(이하 6장에서 추가 설명). 클래스의 최고조상님이다.
서브 클래스 객체 생성
서브 클래스는 슈퍼클래스의 private 멤버를 제외하고 모든 멤버를 접근할 수 있다.
슈퍼클래스 멤버의 접근 지정자
슈퍼클래스 멤버에 선언한 4가지 접근 지정에 대해 다른 클래스에서 어디까지 접근이 허용될까? (O : 접근가능)
Protected의 경우 같은 패키지의 모든 클래스, 그리고 패키지 상관없이 상속받는 서브 클래스에 접근이 가능하다.
슈퍼클래스 멤버에 접근하는 클래스 종류
슈퍼 클래스 멤버의 접근 지정자
private
default
protected
public
같은 패키지에 있는 클래스
X
O
O
O
다른 패키지에 있는 클래스
X
X
X
O
같은 패키지에 있는 서브 클래스
X
O
O
O
다른 패키지에 있는 서브 클래스
X
X
O
O
생성자
Q. 서브 클래스의 생성자와 슈퍼 클래스의 생성자 중 누가 먼저 실행될까? (슈퍼클래스의 생성자)
Q. 서브 클래스 객체가 생성될 때 서브클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행될까? (0)
답의 이유는 아래 그림 '슈퍼 클래스와 서브 클래스의 생성자 간 호출 및 실행 관계도' 를 보면서 이해해보자.
서브 클래스에서 슈퍼 클래스 생성자 선택
슈퍼 클래스에 여러 생성자가 있을 때 서브 클래스의 생성자와 함께 실행될 슈퍼클래스의 생성자는 원칙적으로 서브 클래스의 개발자가 각 생성자에 대해 함께 실행될 슈퍼클래스의 생성자를 지정한다. 그러나 명시하지 않았을 경우 컴파일러가 자동으로 슈퍼클래스의 기본 생성자를 호출하도록 자바 컴파일러가 작동한다.
슈퍼 클래스에 기본 생성자가 없을 경우컴파일 오류 메세지를 출력한다. (Implicit super constructor A() is undefined. Must explicitly invoke another constructor)
서브클래스의 생성자에서 super()를 이용하면 서브클래스에서 명시적으로 슈퍼클래스의 생성자를 선택할 수 있다. 괄호 안에 인자를 넣을 수도 있다. 요점은 super()가 반드시 생성자의 첫 줄에 사용되어야 한다는 것! (예제 5-3 참고)
* super(): 슈퍼 클래스 생성자를 호출하는 코드
캐스팅Casting : 타입 변환. 자바에서 클래스에 대한 캐스팅은 업캐스팅, 다운캐스팅이 있다.
업캐스팅 : 업캐스팅은 슈퍼 클래스의 레퍼런스로 서브 클래스의 객체를 가리키게 한다. 서브 클래스의객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것.
Person p;
Student s = new Student();
p = s; //upcasting
다운캐스팅: 업캐스팅의 반대이며 타입 변환을 명시적 지정해야 한다. 원래의 자기 자신으로 돌린다는 의미.
Student s = (Student)p; //downcasting, (student)의 타입 변환을 반드시 표시해야 됨
instance of 연산자 : 객체가 어떤 클래스를 상속받아 업캐스팅되어 넘어오는 지 구별하는 방법. 이항 연산자이며 레퍼런스가 가리키는 객체가 해당 클래스 타입의 객체이면 true, 아니면 false 로 계산하기 때문에 결과값은 boolean 값이다.
* 래퍼런스 instanceof 클래스명
Person jee = new Student();
Person kii = new Professor();
if (jee instanceof Person) //true
if (jee instanceof Student) //true
if (kii instanceof Student) //false
// if(3 instanceof int) 객체에 대한 레퍼런스만 사용해서 문법 오류.
if ("java" instanceof String) //true
메소드 오버라이딩 method overriding : 슈퍼클래스에서 선언된 메소드와 같은 이름, 같은 리턴 타입, 같은 매개 변수 리스트를 갖는 메소드를 서브 클래스에서 재작성하는 것. 슈퍼클래스에 있는 메소드로 기능을 구현하지 못할 때 동일한 이름의 메소드를 서브클래스에 다시 작성한다. 실행 역시 서브클래스 내의 메소드만 실행된다. (= 슈퍼클래스메소드 무시, 혹은 덮어쓰기라고도 하며 동적바인딩이라고 한다.)
슈퍼클래스 메소드와 동일한 원형으로 작성 (동일 이름, 동일 매개변수 타입, 동일 개수, 동일한 리턴타입의 메소드)
슈퍼클래스 메소드의 접근 지정자보다 접근의 범위를 좁혀 오버라이딩 불가 (키우는 건 가능)
static, private, final 메소드는 서브클래스에서 오버라이딩 할 수 없다.
명품자바프로그래밍 클래스와 객체 5장 예제
| 예제 5-1 | 클래스 상속 만들기
x, y의 한 점을 표현하는 Point 클래스와 이를 상속받아 색을 가진 점을 표현하는 ColorPoint 클래스를 만들고 활용해보자.
(1,2)
red(3,4)
package Luxuryjava05;
class Point {
private int x, y;
// 좌표
public void set(int x, int y) {
this.x = x;
this.y = y;
}
// 좌표 출력
public void showPoint() {
System.out.println("(" + x + "," + y + ")");
}
}
class ColorPoint extends Point {
private String color;
// 점의 색
public void setColor(String color) {
this.color = color;
}
public void showColorPoint() {
// 컬러 점의 좌표
System.out.print(color);
showPoint();
}
}
public class ColorPointEx {
public static void main(String[] args) {
Point p = new Point();
p.set(1, 2);
p.showPoint();
ColorPoint cp = new ColorPoint();
cp.set(3, 4);
cp.setColor("red");
cp.showColorPoint();
}
}
| 예제 5-2 | 상속 관계에 있는 클래스 간 멤버 접근
클래스 Person을 아래와 같은 필드를 갖도록 선언하고, 클래스 Student는 Person을 상속받아 각 멤버 필드에 값을 저장하라.
클래스Person의 private필드 weight는 클래스Student에서 접근 불가능해 슈퍼클래스Person의 get, set 메소드를 통해서만 조작이 가능
private int weight;
int age;
protected int height;
public String name;
package Luxuryjava05;
class Person {
private int weight; // *** student 클래스 접근불가
int age; // 디폴트. student 클래스 접근가능
protected int height; // student 클래스 접근가능
public String name; // student 클래스 접근가능
public void setWeight(int weight) {
this.weight = weight;
}
public int getWeight() {
return weight;
}
}
class Student extends Person {
public void set() {
age = 30;
name = "gildong";
height = 180;
setWeight(99); // 간접접근
// weight = 99; 슈퍼 클래스의 멤버 접근불가
}
}
public class InheritanceEx {
public static void main(String[] args) {
Student s = new Student();
s.set();
}
}
| 예제 5-3 | super()를 활용한 Colorpoint 작성
super()를 이용하여 Colorpoint 클래스 생성자에서 슈퍼 클래스 Point의 생성자를 호출하는 예를 보인다.
blue(5,6)
package Luxuryjava05;
class Point {
private int x, y;
public Point() {
this.x = this.y = 0;
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public void showPoint() {
System.out.println("(" + x + "," + y + ")");
}
}
class ColorPoint extends Point {
private String color;
public ColorPoint(int x, int y, String color) {
super(x, y);
this.color = color;
}
public void showColorPoint() {
System.out.println(color);
showPoint();
}
}
public class SuperEx {
public static void main(String[] args) {
ColorPoint cp = new ColorPoint(5, 6, "blue");
cp.showColorPoint();
}
}
| 예제 5-4 | instanceof 연산자 활용
instanceof 연산자 활용하여 상속 관계에 따라 레퍼런스가 가리키는 객체의 타입을 알아본다. 실행 결과는 무엇인가?
new Student() -> Person Student
new Researcher() -> Person Researcher
new Professor() -> Person Researcher Professor
package Luxuryjava05;
class Person{}
class Student extends Person {}
class Researcher extends Person {}
class Professor extends Researcher {}
public class InstanceOfEx {
static void print(Person p) {
if(p instanceof Person)
System.out.print("Person ");
if(p instanceof Student)
System.out.print("Student ");
if(p instanceof Researcher)
System.out.print("Researcher ");
if(p instanceof Professor)
System.out.print("Professor ");
System.out.println();
}
public static void main(String[] args) {
System.out.print("new Student() -> \t");
print(new Student());
System.out.print("new Researcher() -> \t");
print(new Researcher());
System.out.print("new Professor() -> \t");
print(new Professor());
}
}
| 예제 5-5 | 메소드 오버라이딩으로 다형성 실현
Shape의 draw() 메소드를 Line, Circle, Rect 클래스에서 목적에 맞게 오버라이딩하는 다형성의 사례
Line
Shape
Line Rect
Circle
package Luxuryjava05;
class Shape {
protected Shape next;
protected Shape() { next = null; }
protected void draw() {
System.out.println("Shape");
}
}
class Line extends Shape {
protected void draw() {
System.out.println("Line");
}
}
class Rect extends Shape {
protected void draw() {
System.out.println("Rect");
}
}
class Circle extends Shape {
protected void draw() {
System.out.println("Circle");
}
}
public class MethodOverridingEx {
static void paint(Shape p) {
p.draw();
}
public static void main(String[] args) {
Line line=new Line();
paint(line);
paint(new Shape());
paint(new Line());
paint(new Rect());
paint(new Circle());
}
}
4. 필드는 클래스 내에서 private 보다 public으로 선언하는 것이 바람직하다. --> private
2. 생성자에 대한 설명 중 틀린 것은?
1. 생성자가 작성되어 있지 않으면, 컴파일러가 자동으로 기본 생성자를 추가해준다.
2. 생성자의 이름은 클래스의 이름과 반드시 같아야 한다.
3. this()는 생성자 내에서 다른 생성자를 호출하는 코드이다.
4. 생성자에서는 아무 값도 리턴하지 않기 때문에 return문을 사용할 수 없다. --> 실행을 끝낼 때 생성자 코드 내 return; 문 사용
3. 다음 코드 중 오류가 있는 것은? (배열생성문법)
1. Power []p = new Power[10];
2. Power p[] = new Power[10];
3. Power p[10] = new Power[10];
4. Power[] p;
4. 다음 코드에 대해 설명하는 문항 중 틀린 것은?
Book[] book = new Book[10];
1. book은 배열에 대한 레퍼런스이다.
2. Book 객체가 10개 만들어진다.
3. for(int i=0; i<book.size; i++) book[i] = new Book();로 객체들을 만들어야 비로소 배열이 완성된다.
4. book[0], book[1], ... , book[9] 모두 Book 객체에 대한 레퍼런스이다.
5. 다음 중 메소드 오버로딩에 실패한 사례는?
1번.
--> 메소드 명과 매개변수의 개수와 타입이 달라 메소드 오버로딩에 실패한 사례이다.
※ 리턴 타입이 다른 것은 오버로딩과 연관이 없다.
(1) class A {
int x;
void f(int a) { x = a; }
int f(int b) { return x+b; }
}
(2) class A {
int x;
void f(int a ) { x = a; }
void f() { x = 0; }
}
(3) class A {
int x;
inf f() { return x; }
int f(int a, int b) { return a+b; }
}
(4) class A {
static int x=0;
static int f(int a) { return a+x; }
static int f() { return 3; }
}
6. 다음 코드를 보고 물음에 답해라.
class TV {
private int size;
private String manufacturer;
public TV() {
size = 32;
manufacturer = "LG";
System.out.println(size+"인치 "+ manufacturer);
}
public TV(String manufacturer) {
this.size = 32;
this.manufacturer = "LG";
System.out.println(size+"인치 "+manufacturer);
}
public TV(int size, String manufacturer) {
this.size = 32;
this.manufacturer = "LG";
System.out.println(size+"인치 "+manufacturer);
}
}
(1) this()를 이용하여 생성자를 수정하라.
class TV {
int size;
String manufacturer;
public TV() {
this(32, "LG");
}
public TV(String manufacturer) {
this(32, manufacturer);
}
public TV(int size, String manufacturer) {
this.size=size;
this.manufacturer=manufacturer;
System.out.println(size+"인치 "+manufacturer);
}
}
(2) new TV(); 와 new TV("삼성"); 를 실행하면 실행 결과는 각각 무엇인가? --> 32인치 LG, 32인치 삼성
(3) 65인치 "삼성" TV 객체를 생성하는 코드를 적어라.
new TV(65,"삼성");
(4) this()를 이용하는 장점은? --> 같은 클래스 내의 다른 생성자를 호출하여 사용할 수 있다.
7. 다음 클래스에는 컴파일 오류가 있다. 오류 부분을 지적하고 오류를 수정할 수 있는 방법을 모두 제시하라. 그리고 그 중 객체 지향 프로그래밍에 가장 적합한 방법을 설명하라.
class Person {
private int age;
}
public class Example {
public static void main (String args[]) {
Person aPerson = new Person();
aPerson.age = 17;
}
}
객체 지향 프로그래밍에 가장 적합한 방법으로는 클래스의 주요 필드는 private로 해두고,별도로public 속성의set, get 메소드를 만들어서 이 메소드를 통해 필드를 접근하게끔 하여 필드의 무결성을 유지하는 것이 좋다. 아래는 컴파일 오류가 나는 부분이다.
private int age;
// age가 private로 선언되어 있기 때문에, Person 클래스 밖에서 접근이 불가능
8. 다음 코드를 객체 지향 프로그래밍 관점에서 바람직한 코드로 수정하라.
class Power {
public int kick;
public int punch;
}
public class Example {
public static void main (String args[]) {
Power robot = new Power();
robot.kick = 10;
robot.punch = 20;
}
}
<답>
class Power{
private int kick;
private int punch;
public void setKick(int kick) {
this.kick = kick;
}
public void setPunch(int punch) {
this.punch = punch;
}
}
9. 다음은 객체 소멸에 대한 설명이다. 보기에서 빈칸에 적절한 말을 삽입하라.
자바에서는 객체를 임의로 소멸시킬 수 없으며, 이것은 개발자에게 매우 다행한 일이다. 참조하는 레퍼런스가 하나도 없는 객체를 가비지라고 판단하고, 이를 가용 메모리로 자동 수집하는 가비지 컬렉션을 진행시킨다. 응용프로그램에서 자바 플랫폼에게 이 과정을 지시하고자 하면 System.gc() 코드를 호출하면 된다.
10. 다음 코드가 실행될 때 가비지가 발생하는가? 만일 발생한다면 발생하는 위치와 과정을 설명하라.
(1) String s = null;
for(int n=0; n<10; n++) {
s = new String("Hello"+n);
System.out.println(s);
}
(2) String a = new String("aa");
String b = a;
String c = b;
a = null;
b = null;
(1) 에서 s가 가리키던 new String("Hello"+n); 부분이 반복문을 실행할수록 가비지가 발생한다.
(2) 에서는 가비지가 발생하지 않는다. (결국은 c가 String("aa")를 가리키기 때문)
11. 다음 클래스에서 멤버 함수의 사용이 잘못된 것은? --> (4) static 메소드에서 non-static 멤버를 접근할 수 없다.
class StaticTest {
static int a;
static int getA() { return a; } //(1)
int b;
int getB() { return b; } //(2)
int f() { return getA(); } //(3)
static int g() { return getB(); } //(4)
}
12. 다음 코드에서 잘못된 문장은? -->(1)번.
class StaticSample {
public int x;
public static int y;
public static int f() { return y; }
}
public class UsingStatic {
public static void main (String[] args) {
StaticSample.x = 5; //(1)
StaticSample.y = 10; //(2)
int tmp = StaticSample.f(); //(3)
StaticSample a = new StaticSample();
tmp = a.y; //(4)
}
}
StaticSample StaticSample = new StaticSample();를 main 안에 써야 한다.
static 멤버는 new에 의해 객체가 생성되기 전에 사용이 가능하다.
13. 다음 소스에 틀린 부분이 있는지 판단하라. 만일 있다면 수정하라.
class Test {
public int f(int a, int b) {
return a + b;
}
public static void main (String[] args) {
int sum = f(2,4);
}
}
--> main이 static 타입이므로, f()를 호출하기 위해서는 f()도 static 타입이어야한다.
즉 static public int f(int a, int b) { return a + b; }로 변경해야 한다.
14. 다음 코드에는 final과 관련하여 3가지 잘못된 것이 있다. 잘못된 내용을 설명하라.
final class Rect {
final protected int x = 5;
final public void f() {
x++;
System.out.pring(x);
}
}
class SpecialRect extends Rect { // Rect 상속
public void f() {
System.out.print(super.x); // super.x는 Rect의 x
}
}
x++; ------ final 붙은 변수는 상수기에 변수처럼 변경할 수 없다.
class SpecialRect extends Rect {} ------ final 붙은 클래스는 상속받지 못한다.
System.out.print(super.x); ------ final 붙은 메소드는 오버라이딩을 사용할 수 없다.
15. 가비지와 가비지 컬렉션은 표준 C나 C++에는 없는 자바 언어의 독특한 특성이다. 가비지란 무엇인지, 자바에서는 왜 가비지 컬렉션이 필요한지, 가비지 컬렉션이 개발자에게 주는 장점과 단점은 무엇인지 설명하라.
- 가비지란 new 연산자를 이용하여 시스템으로부터 할당받아 사용되다가 더 이상 사용하지 않는 객체나 배열 메모리를 말한다.
- 가비지가 많아지면 상대적으로 자바 가상 기계에서 으용프로그램에게 할당 해줄 수 있는 가용 메모리의 양이 줄어들어 자바 응용 프로그램의 실행에 영향을 줄 수 있으므로 가비지 컬렉션이 필요.
- 자바 가상 기계는 가용 공간이 일정 크기 이하로 줄어들게 되면 자동으로 가비지를 회수하여 가용 메모리 공간을 늘려 개발자는 할당받은 메모리를 반환하는 코딩 부담을 덜게 된다.
16. 다음 표를 완성하라. 멤버가 4가지 접근 지정자로 각각 선언되었을 때, 같은 패키지의 클래스와 다른 패키지의 클래스에서 이 멤버를 접근할 수 있는지 O, X로 표기하라.
상속 : 자식클래스(sub class)가 부모 클래스(super class)의 속성을 물려받아 사용하고 기능을 추가(extends) 하는 것.
다형성 : 같은 이름의 메소드가 클래스나 객체에 따라 다르게 동작하도록 구현되는 것.
- overriding 오버라이딩 : 슈퍼클래스를 서브클래스에서 동일한 이름으로 자신의 특징에 맞게 재구현하는 것
- overloading 오버로딩 : 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러개 만드는 것
객체 지향 언어의 목적
소프트웨어의 생산성 향상, 실세계에 대한 쉬운 모델링
객체 : 클래스 모양대로 생성된 실체. 클래스의 인스턴스 instance. 사례
클래스 : 객체를 만들기 위한 설계도.
멤버 : 클래스의 구성 요소. 필드와 메소드 두 종류가 있다.
필드 : 객체 내 값을 저장할 멤버 변수
메소드 : 함수이며 객체의 행동을 구현
접근 지정자 access specifier
접근의 범위 지정. public, private, protected, default.
생성자 constructor
- new를 통해 객체가 생성될 때 자동으로 한번만 호출.
- 객체 초기화를 위해 실행되는 클래스의 이름과 동일한 메소드.
- 오버로딩 : 매개변수의 개수와 타입만 다르다면 클래스 내에 생성자를 여러 개 둘 수 있다.
- 리턴 타입을 지정할 수 없다. public Circle() {...} (x) void(x) return;(0)
디폴트 생성자 default constructor
매개변수와 실행코드가 없어 아무 일도 하지 않고 단순리턴하는 생성자
* 객체가 생성될 때 반드시 실행되기에 생성자가 없는 클래스는 없다.
-> 생성자가 하나도 없으면 컴파일러가 생성자를 자동 생성하여 컴파일러 오류가 호출되지 않음
* 생성자가 하나라도 존재하면 기본생성자가 자동으로 삽입되지 않음
-> 컴파일오류 발생
class Circle{
public Circle(){} //기본생성자(디폴트생성자). 단순 리턴만 함
}
레퍼런스 변수 선언 :null로 초기화된다.
Circle 타입 크기의 메모리 할당 -> Circle() 생성자 코드 실행
Circle pizza=new Circle();
Circle pizza; //레퍼런스를 가지는 변수일 뿐 아직 객체가 생성된 것이 아니다.
pizza=new Circle(); //객체 생성은 new 연산자를 사용해서 객체를 생성한다.
객체 멤버 접근 : 레퍼런스 변수 뒤 점 연산자를 붙인다.
pizza.radius=10; //pizza 객체의 radius 필드에 10 대입
int r=pizza.radius; //pizza 객체의 radius 필드값 읽을 때
this 레퍼런스 : 객체 자신을 가리키는 레퍼런스. 메소드에서 사용되며 현재 실행되고 있는 메소드가 속한 객체에 대한 참조로 컴파일러에 의해 자동 관리된다. static에서는 사용될 수 없다.
public Circle(int radius) {this.radius=radius;}
// 멤버, 매개변수
public Circle getMe() {return this;} //객체 자신의 레퍼런스 리턴
this() : 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용되는 자바코드.
반드시 생성자 코드에서만 호출, 같은 클래스 내 다른 생성자 호출 시 사용, 생성자의 첫 번째 문장
객체 배열 : 기본 타입 데이터 외 객체에 대한 레퍼런스를 원소로 갖는 배열
Circle[] c; //배열에 대한 레퍼런스 선언
c=new Circle[5]; //Circle 객체에 대한 레퍼런스 생성
for(int i=0; i<c.length; i++) //c.length는 배열 c의 크기(5)
c[i]=new Circle(i); //i번째 Circle 객체 생성
명품자바프로그래밍 클래스와 객체 4장 예제
| 예제 4-1 | 반지름과 이름을 가진 Circle 클래스를 작성하고, Circle 클래스의 객체를 생성하라. 그리고 객체가 생성된 모습을 그려보라.
* No enclosing instance of type ... is accessible 컴파일 오류 : 보통 내부에 있는 클래스를 static 함수를 참조할 때 에러 >> 자바피자의 면적은 314.0, 등킨드나쓰의 면적은 12.56
package Luxuryjava04;
public class Circle {
int radius; //원의 반지름필드
String name; //원의 이름필드
public Circle() { } //생성
public double getArea() {
return 3.14*radius*radius;
}
public static void main(String[] args) {
Circle pizza; //참조변수 피자 선언
pizza=new Circle(); //원 객체 생성
pizza.radius=10; //피자 반지름 설정
pizza.name="자바피자"; // 피자 이름설정
double area=pizza.getArea(); //피자 면적알기
System.out.println(pizza.name+"의면적은"+area);
Circle donut=new Circle(); //원 객체 생성
donut.radius=2; //도넛 반지름 설정
donut.name="등킨드나쓰"; //도넛 이름설정
area=donut.getArea(); //도넛 면적알기
System.out.println(donut.name+"의면적은"+area);
}
}
| 예제 4-2 | 너비와 높이를 입력받아 사각형의 합을 출력하는 프로그램을 작성하라. 너비와 높이 필드, 그리고 면적 값을 제공하는 getArea() 메소드를 가진 Rectangle 클래스를 만들어 활용하라. *객체는 new 연산자로 생성하고, .쩜 연산자로 멤버를 접근한다.
>> 4 5
사각형의 면적은 20
package Luxuryjava04;
import java.util.Scanner;
class Rectangle{
int width, height;
public int getArea() {
return width*height;
}
}
public class RectApp {
public static void main(String[] args) {
Rectangle rect=new Rectangle(); //객체 생성
Scanner s=new Scanner(System.in);
System.out.print(">>");
rect.width=s.nextInt();
rect.height=s.nextInt();
System.out.println("사각형의 면적은 "+rect.getArea());
s.close();
}
}
| 예제 4-3 | 다음 코드는 2개의 생성자를 가진 CircleA 클래스다. 실행 결과는?
>> javapizza의 면적은 314.0
oraclepizza의 면적은 3.14
package Luxuryjava04;
public class CircleA {
int radius;
String name;
//생성자는 클래스 이름과 동일
public CircleA() { //매개변수 없는 생성자
radius=1; name=""; // field 초기화
}
//생성자는 리턴타입 없음
public CircleA(int r, String n) { //매개변수를 가진 생성자
radius=r; name=n; //매개변수로 필드 초기화
}
public double getArea() {
return 3.14*radius*radius;
}
public static void main(String[] args) {
CircleA pizza=new CircleA(10, "javapizza");
//객체 생성,반지름과 이름 초기화
double area=pizza.getArea();
System.out.println(pizza.name+"의 면적은 "+area);
CircleA donut=new CircleA(); //객체 생성,반지름과 이름 초기화
donut.name="oraclepizza"; //이름변경
area=donut.getArea();
System.out.println(donut.name+"의 면적은 "+area);
}
}
| 예제 4-4 | 제목과 저자를 나타내는 title과 author필드를 가진 Book 클래스를 작성하고, 생성자를 작성하여 필드를 초기화하라.
>> 어린왕자 생텍쥐페리
춘향뎐 작자미상
package Luxuryjava04;
public class Book {
String title, author;
public Book(String t) { //생성자로 오버로딩.
title=t;
author="작자미상";
}
public Book(String t, String a) { //생성자로 오버로딩. 매개변수의 개수가 다름.
title=t;
author=a;
}
public static void main(String[] args) {
Book littlePrince=new Book("어린왕자", "생텍쥐페리");
Book llovestory=new Book("춘향뎐");
System.out.println(littlePrince.title+" "+littlePrince.author);
System.out.println(llovestory.title+" "+llovestory.author);
}
}
| 예제 4-5 | 4-4에서 작성한 Book클래스의 생성자를 this()를 이용하여 수정하라.
>> 생성자 호출됨
춘향뎐 작자미상
package Luxuryjava04;
public class Book {
String title, author;
void show() {
System.out.println(title+" "+author);
}
public Book() {
this("","");
System.out.println("생성자 호출됨");
}
public Book(String title) {
this(title,"작자미상");
}
public Book(String title, String author) {
this.title=title;
this.author=author;
}
public static void main(String[] args) {
Book littlePrince=new Book("어린왕자", "생텍쥐페리");
Book llovestory=new Book("춘향뎐");
Book emptyBook=new Book();
llovestory.show();
}
}
4. Scanner를 이용하여 소문자 알파벳을 하나 입력받고 다음과 같이 출력하는 프로그램을 작성하라. 다음은 e를 입력받았을 경우이다.
소문자 알파벳 하나를 입력하시오 >> e
abcde
abcd
abc
ab
a
※ Scanner는 문자를 입력받는 기능이 없으므로 문자열을 입력받아야 한다. String s=scanner.next(); ----문자열 읽기 char c=s.charAt(0); -------문자열의 첫 번째 문자
5. 양의 정수 10개 입력받아 배열에 저장하고, 배열에 있는 정수 중에서 3의 배수만 출력하는 프로그램을 작성하라.
6. 배열과 반목문을 이용하여 프로그램을 작성해보자. 키보드에서 정수로 된 돈의 액수를 입력받아 오만 원권, 만 원권, 천 원 권, 500원, 100원, 50원, 10원, 1원짜리 동전이 각 몇 개로 변환되는지 예시와 같이 출력하라. 이 때 반드시 다음 배열을 이용하고 반복문으로 작성하라.
int []unit={50000, 10000, ....};
7. 정수를 10개 저장하는 배열을 만들고 1에서 10까지 범위의 정수를 랜덤하게 생성하여 배열에 저장하라. 그리고 배열에 든 숫자들과 평균을 출력하라.#명품자바3장7번실습문제
int i = (int)(Math.random()*10+1);
8. 정수를 몇 개 저장할 지 키보드로부터 100보다 작은 갯수를 입력받아 정수 배열을 생성하고, 이곳에 1에서 100까지 범위의 정수를 랜덤하게 삽입하라. 배열에는 같은 수가 없도록 하여 배열을 출력하라.#명품자바3장8번실습문제
정수 몇 개 ? 24
48 33 74 94 17 39 55 8 59 81
... (랜덤한 정수가 24개 출력)
9. 4x4의 2차원 배열을 만들고 이곳에 1에서 10까지 범위의 정수를 랜덤하게 생성하여 정수 16개를 배열에 저장하고, 2차원 배열을 화면에 출력하라.#명품자바3장9번실습문제
6 10 1 8
1 3 7 2
8 4 5 1
1 8 4 4
10. 4x4의 2차원 배열을 만들고 이곳에 1에서 10까지 범위의 정수를 10개만 랜덤하게 생성하여 임의의 위치에 삽입하라. 동일한 정수가 있어도 상관없다. 나머지 6개의 숫자는 모두 0이다. 만들어진 2차원 배열을 화면에 출력하라.#명품자바3장10번실습문제
5 0 8 6
0 7 9 5
2 4 0 8
0 0 0 8
11. 다음과 같이 작동하는 Average.java를 작성하라. 명령행 인자는 모두 정수만 사용되며 정수들의 평균을 출력한다. 다음 화면은 컴파일된 Average.class파일을 c:\Temp 디렉토리에 복사한 뒤 실행한 경우이다. 원본 Average.class파일은 이클립스의 프로젝트 폴더 밑 bin폴더에 있다.
C: \Temp>java Average 2 3 4
3 ------- 2 3 4의 평균
C :\Temp>
12. 다음과 같이 작동하는 Add.java를 작성하라. 명령행 인자 중에서 정수만을 골라 합을 구하라. 다음 화면은 명령프롬프트에서 Add.class파일을 c:\Temp 디렉토리에 복사한 뒤 실행한 경우이다. 원본 Add.class파일은 이클립스 폴더 밑 bin폴더에 있다.
C: \Temp>java Add 2 3 aa 5 6.5 ---- 이 중 정수만 더하여 출력
10
C :\Temp>java Add Heaven 3 4 4.3 c
7
C :\Temp>
※ 문자열을 정수로 변환할 때 다음 코드를 이용하라.
int i = Integer.parseInt("10"); // i는 10
13. 반복문을 이용하여 369게임에서 박수를 쳐야 하는 경우를 순서대로 화면에 출력해보자. 1부터 시작하며 99까지만 한다.
그리고 다음 예시와 같이 과목 이름을 입력받아 점수를 출력하는 프로그램을 작성하라. "그만"을 입력받으면 종료한다. ※ 문자열을 비교하기 위해서는 String 클래스의 equals()메소드를 이용해야 한다.
과목 이름 >> Jaba
없는 과목입니다.
과목 이름 >> Java
Java의 점수는 95
과목 이름 >> C++
C++의 점수는 88
과목 이름 >> 그만
15. 다음은 2개 정수를 입력받아 곱을 구하는 Multiply 클래스이다.
import java.util.Scanner;
public class Multiply{
public static void main(String[]args){
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int m=scanner.nextInt();
System.out.print(n+"x"+m+"="+n*m);
scanner.close();
}
}
다음과 같이 실행할 때 프로그램은 10과 5를 곱해 50을 잘 출력한다. 하지만 실수를 입력하면 예외가 발생하는데, 실수가 입력되면 정수를 다시 입력하도록 하여 예외 없이 정상적으로 처리되도록 예외 처리 코드를 삽입하여 Multiply 클래스를 수정하라.
곱하고자 하는 두 수 입력 >> 10 5
10x5=50
※ InputMismatchException 예외를 처리할 try-catch 코드를 작성하고, catch 블록에서 Scanner에 이미 입력된 키를 모두 제거하기 위해 Scanner의 nextLine()을 호출하라.
곱하고자 하는 두 수 입력 >> 2.5 4
실수는 입력하면 안됩니다.
곱하고자 하는 두 수 입력 >> 4 3
4x3=12
16. 컴퓨터와 독자 사이의 가위바위보 게임을 만들어보자. 예시는 다음 그림과 같다. 독자부터 먼저 시작하여 가위 바위 보 중 하나를 입력하고 <Enter>키를 치면, 프로그램은 가위 바위 보 중에서 랜덤하게 하나를 선택하고 컴퓨터가 낸 것으로 한다. 독자가 입력한 값과 랜덤하게 선택한 값을 비교하여 누가 이겼는지 판단한다. 독자가 가위 바위 보 대신 "그만"을 입력하면 게임Over.
컴퓨터와 가위 바위 보 게임을 합니다.
가위 바위 보! >> 바위
사용자 = 바위, 컴퓨터 = 가위, 사용자가 이겼습니다
가위 바위 보! >> 그만
게임을 종료합니다...
| 연습문제 3-3 | 1에서 100까지 3의 배수를 더하는 while 문의 빈칸에 적절한 코드를 삽입하라.
continue
int sum=0, i=1;
while (i<100) {
if(i%3 != 0) {
i++;
_________;
}
else sum += i;
i++;
}
| 연습문제 3-4 | 1에서 50까지의 합을 더하는 while 문이다. 빈칸에 적절한 코드를 삽입하라.
i>50
package Luxuryjava03;
public class y0304 {
public static void main(String[] args) {
int sum=0,i=1;
while (true) {
if(_______) break;
sum+=i;
i++;
}
System.out.println(sum);
}
}
1) 원형은 public abstract void main(String[] args)이다.
2) 자바 프로그램은 main() 메소드에서부터 실행을 시작한다.
3) 명령행이 java Hello abc 5이면, "abc"와 "5"가 문자열 배열로 만들어져 Hello 클래스 안에 있는 main() 메소드에 전달된다.
4) 명령행이 java Hello abc 5일 때, Hello 클래스에 main() 메소드가 없으면 실행 시작 후 바로 오류를 내면서 종료한다.
| 연습문제 3-14 | 다음 문장에서 빈 칸에 적절한 단어를 찾아 삽입하라.
자바 프로그램이 문법에 맞지 않게 작성 되었을 때, 컴파일러 는 컴파일 오류를 발생시킨다. 예외 는 컴파일 오류가 없는 지비 프로그램이 실행 중 발생한 오류를 말하며, 프로그램이 이 오류에 대한 대처가 없다면 바로 종료 된다. 이런 오류가 발생할 가능성이 있는 코드들을 try 블록에 넣고, 오류가 발생하면 처리할 코드는 catch블록에 넣는다. finally 블록은 생략 가능하다.
배열 : 인덱스와 인덱스에 대응하는 데이터들로 이루어진 연속적인 자료 구조로서 같은 타입의 데이터들이 순차적으로 저장된다. 자바에서 객체로 다루어지며 배열을 만드는 과정은 1) 배열 레퍼런스 변수 선언 , 2)배열 생성 과정으로 나뉜다. 배열 레퍼런스 변수 선언은 배열 객체의 주소 값을 가질 변수에 대한 선언이고 배열의 생성은 배열 원소에 대한 순차적 저장 공간을 확보하는 것이다. 배열 원소에 대한 접근은 배열 레퍼런스 변수명과 [ ] 사이에 원소의 인덱스를 적어 접근한다.
int [] array = new int[]; //1번방법
int array [] = new int[]; //2번방법
※ 배열의 크기는 배열 객체의 length 필드에 저장되며 첫 번째 원소의 인덱스는 0, 마지막 원소의 인덱스는 length-1이 된다. 배열의 인덱스는 정수만 가능. main() 메소드에 인자 전달은String 타입의 배열을 이용한다.
package Luxuryjava03;
import java.util.Scanner;
public class P0305 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("정수를 5개 입력하세요.");
int sum=0;
for(int i=0; i<5; i++) {
int n=s.nextInt();
if(n<=0)
continue; // 양수가 아닌 경우 다음반복
else
sum+=n; // 양수인 경우 더하기
}
System.out.println("양수의 합은 "+sum);
s.close();
}
}
6. exit이 입력되면 while문을 벗어나도록 break 문을 활용하는 프로그램을 작성하라. #명품자바프로그래밍3장6번예제
* break : 근처의 반복문을 벗어난다.
package Luxuryjava03;
import java.util.Scanner;
public class P0306 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("exit을 입력하면 종료쓰");
while(true) {
System.out.print(">>");
String text=s.nextLine(); // nextLine 한줄단위입력
if(text.equals("exit")) // equals. 문자열 비교
break;
}
System.out.println("종료데쓰...");
s.close();
}
}
7. 양수 5개를 입력받아 배열에 저장하고, 제일 큰 수를 출력하는 프로그램을 작성하라.#명품자바프로그래밍3장7번예제
package Luxuryjava03;
import java.util.Scanner;
public class P0307 {
public static void main(String[] args){
Scanner s=new Scanner(System.in);
int intArray[]=new int[5]; //배열 생성
int max=0;
System.out.println("양수 5개를 입력하세요");
for(int i=0; i<5; i++){
intArray[i] = s.nextInt(); // 입력받은 정수들을 배열에 저장
if(intArray[i]>max) //intArray[i]가 현재 가장 큰 수보다 크면
max=intArray[i];
}
System.out.print("가장 큰 수는 "+max+"입니다.");
s.close();
}
} // 양수 5개 1, 39, 78, 100, 99 중 가장 큰 수는 100입니다.
package Luxuryjava03;
public class P0309 {
enum Week{월,화,수,목,금,토,일}
public static void main(String[] args){
int []n= {1,2,3,4,5};
String names[]={"사과", "배", "바나나", "체리", "딸기", "포도"};
int smu=0;
for(int k:n){
System.out.print(k+" ");
sum+=k;
}
System.out.println("합은"+sum);
for(String s:names)
System.out.print(s+" ");
System.out.println();
for(Week day: Week.values())
System.out.print(day+"요일 ");
System.out.println();
}
}
10. 2차원 배열에 학년별로 1,2학기 성적으로 저장하고, 4년간 전체 평점 평균을 출력하라. #명품자바프로그래밍3장10번예제
package Luxuryjava03;
public class P0310 {
public static void main(String[] args){
double score[][]={{3.3, 3.4},{3.5, 3.6},{3.7, 4.0},{4.1, 4.2}};
double sum=0;
for(int year=0; year<score.length; year++)
for(int term=0; term<score[year].length; term++)
sum+=score[year][term]; //전체 평점 합(for문을 두 번 돌기에 전체 평점 합이 가능)
int n=score.length;
int m=score[0].length;
System.out.println("4년 전체 평점 평균은 "+sum/(n*m));
}
} // 4년 전체 평점 평균은 3.725
1. Scanner 클래스를 이용하여 입력받은 원화 값을 달러로 바꾸어 다음 예시와 같이 출력하는 프로그램을 작성하라. ($1=1100원으로 가정)
원화를 입력하세요(단위 원) >> 3300
3300원은 $3.0입니다.
package Luxuryjava;
import java.util.Scanner;
public class h0201 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("원화를 입력하세요(단위:원)>>");
int num=s.nextInt();
double dollar=num/1100;
System.out.println(num+"원은 $"+dollar+"입니다.");
s.close();
}
}
2. Scanner 클래스를 이용하여 2자리의 정수(10~99사이)를 입력받고, 십의 자리와 1의 자리가 같은 지 판별하여 출력하는 프로그램을 작성하라.
2자리수 정수 입력(10~99) >> 77
Yes! 10의 자리와 1의 자리가 같습니다.
※ Tip. 10의 자리를 10으로 나누고 1의 자리를 10으로 나눈 나머지값이 같은 지를 판별합니다
package Luxuryjava;
import java.util.Scanner;
public class h0202 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("2자리의 정수 입력(10~99)>>");
int num = s.nextInt();
if (num/10==num%10) {
System.out.println("Yes! 10의자리와 1의 자리가 같습니다.");
}else {
System.out.println("No! 10의 자리와 1의 자리가 다릅니다.");
}s.close();
}
}
※ 2자리의 정수인지도 판별해 주려면 이렇게 추가해주면 됩니다. 여기서 스캐너는 한 번 밖에 작동되지 않습니다.
package Luxuryjava;
import java.util.Scanner;
public class h0202 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("2자리의 정수 입력(10~99)>>");
int num = s.nextInt();
if (num>=10 && num<100) {
if (num/10==num%10) {
System.out.println("Yes! 10의자리와 1의 자리가 같습니다.");
}else {
System.out.println("No! 10의 자리와 1의 자리가 다릅니다.");
}
} else {
System.out.println("2자리의 정수가 아닙니다.");
}s.close();
}
}
3. 3. Scanner 클래스를 이용하여 정수로 된 돈의 액수를 입력받아 오만 원권, 만 원권, 천 원권, 500원짜리 동전, 100원짜리 동전, 50원짜리 동전, 10원짜리 동전, 1원짜리 동전 각 몇개로 변환되는지 출력하라. #자바지폐단위별숫자구하기#자바자판기프로그램#자바잔돈프로그램
금액을 입력하시오 >> 65376
오만 원권 1매
만 원권 1매
천 원권 5매
100원 3개
50원 1개
10원 2개
1원 6개
※ 스캐너 생성, num이라는 변수 생성한 후 입력받은 값을 50,000으로 나눈 몫, 50,000으로 나눈 나머지, 위에서 나온 나머지를 10,000으로 나눈 몫, 그리고 10,000으로 나눈 나머지 .... 이것을 1원까지 반복해주는 것입니다. 마지막 1원은 나머지가 없으므로 나누기만 하고 끝납니다.
package Luxuryjava;
import java.util.Scanner;
public class homework0203 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("금액을입력하시오>>");
int num=s.nextInt();
System.out.println("50000won"+num/50000+"mae");
num%=50000;
System.out.println("10000won"+num/10000+"mae");
num%=10000;
System.out.println("1000won"+num/1000+"mae");
num%=1000;
System.out.println("100won"+num/100+"mae");
num%=100;
System.out.println("50won"+num/50+"mae");
num%=50;
System.out.println("10won"+num/10+"mae");
num%=10;
System.out.println("1won"+num/1+"mae");
s.close();
}
}
※ 배열로 푸는 법. 2장에서는 배우지 않았지만 훨씬 간단합니다.
package Luxuryjava;
import java.util.Scanner;
public class h0203 {
public static void main(String[] args) {
int[] coin = {50000, 10000, 1000, 500, 100, 50, 10, 1};
Scanner s=new Scanner(System.in);
System.out.println("금액을 입력하시오>>");
int num=s.nextInt();
for (int i=0; i<coin.length; i++) {
System.out.println(coin[i]+"원:" + num/coin[i]);
num%= coin[i];
}
s.close();
}
}
4. Scanner 클래스로 정수 3개를 입력받고 3개의 숫자 중 중간 크기의 수를 출력하라. 평균값을 구하는 것이 아님에 주의
정수 3개 입력 >> 20 100 33
중간 값은 33
※ 변수 세개와 스캐너 세번 선언! if-else, else if 구문을 사용하여 a<b<c 일 때(중간값 b), b<a<c 일 때(중간값 a), 나머지 일 때(중간값 c)로 조건을 걸어줍니다.
package Luxuryjava;
import java.util.Scanner;
public class h0204 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int a,b,c;
System.out.println("정수 3개 입력>>");
a=s.nextInt();
b=s.nextInt();
c=s.nextInt();
if(a<b && b<c) {System.out.print("중간 값은"+b+"입니다.");}
if(b<a && a<c) {System.out.print("중간 값은"+a+"입니다.");}
else {System.out.print("중간 값은"+c+"입니다.");}
s.close();
}
}
5. Scanner 를 이용하여 삼각형의 변의 길이를 나타내는 정수를 3개 입력받고 이 3개의 수로 삼각형을 만들 수 있는 지 판별하라. 삼각형이 되려면 두 변의 합이 다른 한 변의 합보다 커야 한다.
정수 3개 입력 >> 4 3 5
삼각형이 됩니다.
※ 삼각형이 되려면 가장 긴 변이 2변의 합보다 작아야 합니다.
package Luxuryjava;
import java.util.Scanner;
public class h0205 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("정수 3개를 입력>>");
int l1=s.nextInt();
int l2=s.nextInt();
int l3=s.nextInt();
if((l1+l2)<l3 || (l1+l3)<l2 || (l2+l3)<l1)
System.out.println("삼각형을 만들 수 없습니다.");
else
System.out.println("삼각형이 됩니다.");
s.close();
}
}
6. 369게임을 간단히 작성해보자. 1~99까지의 정수를 입력받고 정수에 3,6,9 중 하나가 있는 경우는 "박수짝"을 출력하고 두 개 있는 경우는 "박수짝짝"을 출력하는 프로그램을 작성하라. 예를 들면, 키보드로 입력된 수가 13인 경우 "박수짝"을, 36인 경우 "박수짝짝"을 출력하면 된다. #자바369게임#자바베스킨라빈스
1~99 사이의 정수를 입력하시오 >> 36
박수짝짝
※ if조건문과 연산자 (0일 경우, 범위가 아닐 경우도 넣기)
package Luxuryjava;
import java.util.Scanner;
public class h0206 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.print("1~99 사이의 정수를 입력하시오>>");
int num=s.nextInt();
if(num!=0 && num>=1 && num <=99) {
int a,b;
a=num/10;
b=num%10;
if((a==3 || a==6 || a==9) && (b==3 || b==6 || b==9)) {
System.out.println("박수짝짝");
}else if((a==3 || a==6 || a==9) || (b==3 || b==6 || b==9)) {
System.out.println("박수짝"); }
}
else {
System.out.println("숫자의 범위를 벗어났습니다.");
}
s.close();
}
}
7. 2차원 평면에서 직사각형은 왼쪽 상단 모서리와 오른쪽 하단 모서리의 두 점으로 표현한다. 100,100과 200,200의 두 점으로 이루어진 사각형이 있을 때 Scanner를 이용하여 정수 x와 y 값을 입력받고 점 (x,y)가 이 직사각형 안에 있는 지를 판별하는 프로그램을 작성하라.
점 (x,y)의 좌표를 입력하시오 >> 150 150 (150,150)은 사각형 안에 있습니다.
※ if조건과 논리
package Luxuryjava;
import java.util.Scanner;
public class h0207 {
public static void main(String[] args) {
System.out.println("점 (x,y)의 좌표를 입력하시오 >>");
Scanner s=new Scanner(System.in);
int x=s.nextInt();
int y=s.nextInt();
if((100<=x && x<=200)&&(100<=y && y<=200))
System.out.println("사각형 안에 점이 있습니다.");
else System.out.println("사각형 안에 점이 없습니다.");
s.close();
}
}
8. 2차원 평면에서 직사각형은 문제 7번처럼 두 점으로 표현된다. 키보드로부터 사각형을 구성하는 두 점(x1, y1), (x2, y2)를 입력받아 100,100과 200,200의 두 점으로 이루어진 사각형과 충돌하는지 판별하는 프로그램을 작성하라. (아래 코드를 참고하여 만드시오) #자바사각형안의점#자바사각형충돌
다음은 점(x,y)가 사각형 (rectx1, recty1), (rectx2, recty2) 안에 있으면 true를 리턴하는 메소드이다. 이를 활용하라.
public static boolean inRect(int x, int y, int rectx1, int rectx2, int recty1, int recty2){
if ((x>=rectx1 && x<=rectx2) && (y>=recty1 && y<=recty2))
{ return true; }
else { return false; }
}
※ if조건과 논리 : 한 꼭지점이 걸칠 경우, 모든 꼭지점이 안에 있는 경우, (100,100),(200,200)의 모든 꼭지점이 사각형 안에 있는 경우 (만든 사각형이 더 큰 경우)
package Luxuryjava;
import java.util.Scanner;
public class h0208 {
public static boolean inRect(int x, int y,
int rectx1, int rectx2, int recty1, int recty2) {
if((x>=rectx1 && x<=rectx2) && (y>=recty1 && y<=recty2))
return true;
else
return false;
}
public static void main(String[] args) {
System.out.println("두 점 (x1,y1), (x2,y2)의 좌표를 입력하시오 >>");
Scanner s=new Scanner(System.in);
int x1=s.nextInt();
int y1=s.nextInt();
int x2=s.nextInt();
int y2=s.nextInt();
if (inRect(x1,y1,100,100,200,200) ||
inRect(x2,y2,100,100,200,200) ||
inRect(x1,y2,100,100,200,200) ||
inRect(x2,y1,100,100,200,200))
System.out.println("사각형이 겹칩니다.");
else if ((inRect(x1,y1,100,100,200,200)) &&
inRect(x2,y2,100,100,200,200) &&
inRect(x2,y1,100,100,200,200) &&
inRect(x1,y2,100,100,200,200))
System.out.println("사각형이 겹칩니다.");
else if ((inRect(100,100,x1,y1,x2,y2)) &&
inRect(100,200,x1,y1,x2,y2) &&
inRect(200,100,x1,y1,x2,y2) &&
inRect(200,200,x1,y1,x2,y2))
System.out.println("사각형이 겹칩니다.");
else
System.out.println("사각형이 겹치지 않습니다.");
s.close();
}
}
※ 주어진 inRect를 사용하지 않고 푸는 방법
package Luxuryjava;
import java.util.Scanner;
public class h02081 {
public static void main(String[] args) {
System.out.println("두 점 (x1,y1), (x2,y2)의 좌표를 입력하시오 >>");
Scanner s=new Scanner(System.in);
int x1=s.nextInt();
int y1=s.nextInt();
int x2=s.nextInt();
int y2=s.nextInt();
if ((x1>=100 & x1<=200) && (y1>=100 && y1<=200)) {
System.out.println("사각형이 겹침");
}else if((x2>=100 && x2<200) && (y2>=100 && y2<=200)) {
System.out.println("사각형이 겹침");
}else if(x1<=100 && x2>=200 && y1<=100 && y2>=200) {
System.out.println("사각형이 겹침");
}
else
System.out.println("사각형이 안겹침");
s.close();
}
}
9. 원의 중심을 나타내는 한 점과 반지름을 실수 값으로 입력받아라. 그리고 실수 값으로 다른 점 (x.y) 을 입력받아 이 점이 원의 내부에 있는지 판별하여 출력하라. #자바원충돌
원의 중심과 반지름 입력>> 10 10 6.5
점 입력>> 13 13
점 (13.0,13.0)은 원 안에 있습니다.
※ 중심에서 점 ( x,y ) 사이의 거리가 반지름보다 작거나 같으면 원의 내부에 있다. 변수 x에 대한 제곱근의 값은 Math.sqrt(x)를 이용하면 된다. (Math함수는 6장 참고)
※ 원의 중심과 점의 거리가 반지름 길이와 같거나 작아야 합니다. √(x2-x1)2 + (y2-y1)2 , 원의 넓이 = 반지름2 *원주
package Luxuryjava;
import java.util.Scanner;
public class h0209 {
public static void main(String[] args) {
System.out.println("원의 중심과 반지름 입력>>");
Scanner s=new Scanner(System.in);
double p1=s.nextDouble();
double p2=s.nextDouble();
double r=s.nextDouble();
System.out.println("점 입력>>");
double x=s.nextDouble();
double y=s.nextDouble();
double distance=Math.sqrt((x-p1)*(x-p1)+(y-p2)*(y-p2));
if(distance<r)
System.out.println("점"+x+","+y+"은"+"원 안에 있습니다.");
else
System.out.println("점"+x+","+y+"은"+"원 밖에 있습니다.");
s.close();
}
}
10. 원의 정보를 받기 위해 키보드로부터 원의 중심을 나타내는 한 점과 반지름을 입력받는다. 두 개의 원을 입력받고 두 원이 서로 겹치는지 판단하여 출력하라.
첫번째 원의 중심과 반지름 입력>> 10 10 3
두번째 원의 중심과 반지름 입력>> 12 12 2
두 원은 서로 겹친다.
※ 두 개의 반지름의 합보다 작으면 원이 겹칩니다.
package Luxuryjava02;
import java.util.Scanner;
public class h0210 {
public static void main(String[] args) {
System.out.println("첫 번째 원의 중심과 반지름 입력>>");
Scanner s=new Scanner(System.in);
int x=s.nextInt();
int x1=s.nextInt();
double r=s.nextDouble();
System.out.println("두 번째 원의 중심과 반지름 입력>>");
int y=s.nextInt();
int y1=s.nextInt();
double r1=s.nextDouble();
double distance=0;
distance = Math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
if (distance<=r+r1)
System.out.println("두 원은 서로 겹친다.");
else
System.out.println("두 원은 서로 안겹친다.");
s.close();
}
}
11. 숫자를 입력받아 3~5는 봄, 6~8은 여름, 9~11은 가을, 12,1,2는 겨울, 그 외의 숫자를 입력한 경우 잘못입력을 출력하는 프로그램을 작성하라. if-else 문과 switch 둘 다 이용해볼 것.
달을 입력하세요(1~12) >> 9 가을
(1) if-else
package Luxuryjava;
import java.util.Scanner;
public class h0211 {
public static void main(String[] args) {
System.out.println("달을 입력하세요(1~12)>>");
Scanner m=new Scanner(System.in);
int num=m.nextInt();
if (num>=3 && num<=5)
System.out.println("봄");
else if(num>=6 && num<=8)
System.out.println("여름");
else if(num>=9 && num<=11)
System.out.println("가을");
else if(num==12 || num==1 || num==2)
System.out.println("겨울");
else
System.out.println("잘못된 만남이 아니고 입력");
m.close();
}
}
(2) switch
package Luxuryjava;
import java.util.Scanner;
public class h02111 {
public static void main(String[] args) {
System.out.println("달을 입력하세요(1~12)>>");
Scanner m=new Scanner(System.in);
int num=m.nextInt();
switch(num) {
case 3: case 4: case 5:
System.out.println("봄");
break;
case 6: case 7: case 8:
System.out.println("여름");
break;
case 9: case 10: case 11:
System.out.println("가");
break;
case 12: case 1: case 2:
System.out.println("겨울");
break;
default:
System.out.println("잘못입력");
}
m.close();
}
}
12. 사칙 연산을 입력받아 계산하는 프로그램을 작성하고자 한다. 연산자는 + - * / 의 네 가지로 하고 피연산자는 모두 실수로 한다. 피연산자와 연산자는 실행 사례와 같이 빈 칸으로 분리하여 입력한다. 0으로 나누기 시 "0으로 나눌 수 없습니다."를 출력하고 종료한다.
연산 >> 2+4 2+4의 계산 결과는 6
※ 문자열 s가 "+"와 같은 지 검사하려면 if(s.equals.("+"))를 이용하며, true이면 s와 "+"가 같다.
package Luxuryjava02;
import java.util.Scanner;
public class h0212 {
// 연산자 : an operator , 결과 : result
public static void main(String[] args) {
System.out.print("연산>>");
Scanner s=new Scanner(System.in);
int op1=s.nextInt();
String op=s.next();
int op2=s.nextInt();
int res=0;
if(op.equals("+"))
res=op1+op2;
else if(op.equals("-"))
res=op1-op2;
else if(op.equals("*"))
res=op1*op2;
else if(op.equals("/")) {
if(op2==0) {
System.out.print("0으로 나눌 수 없습니다.");
s.close();
return;
}
else
res=op1/op2;
}
else {
System.out.print("사칙연산이 아닙니다.");
s.close();
return;
}
System.out.println(op1+op+op2+"의 계산결과는"+res);
s.close();
}
}
package Luxuryjava02;
import java.util.Scanner;
public class h02121 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.print("연산>>");
int op1=s.nextInt();
String op=s.next();
int op2=s.nextInt();
int res=0;
switch(op) {
case "+":
res=op1+op2;
break;
case "-":
res=op1*op2;
case "*":
res=op1*op2;
case "/":
if(op2==0) {
System.out.print("0으로 나눌수없다");
s.close();
}
res=op1/op2;
break;
default:
System.out.print("사칙연산이아닙니다.");
s.close();
break;
}
System.out.print(op1+op+op2+"의 계산결과는"+res);
s.close();
}
}
package test02;
public class test0213 {
public static void main(String[] args) {
//char grade = 'A';
char grade = 'F';
int sum = 0;
switch (grade) {
case 'A':
sum += 100;
case 'B':
sum += 50;
case 'C':
sum += 30;
case 'D':
sum += 10;
}
System.out.print(sum);
}
}