SCJP by Richard F. Raposa

Энэ буландаа SCJP шалгалтанд бэлдэх Richard-н номны эхний хэдэн chapter-г нь өмнө нь орчуулж байснаа хүргэе...

SCJP – Exam Preparation 1.1. (Chapter 1. Section 1.)

1. Exam Objectives of Chapter 1: 1.1. Өгөгдсөн жишээ код болон зохиомжийн дагуу, тохирох package, access modifier, import statement ашигласан код бичих 1.2. Өгөгдсөн class болон command line-н runtime үеийн төлвийг тодорхойлох 1.3. Параметрууд дээрээ утга оноох болон өөчрлөх үйлдэл хийдэг method руу дамжуулагдаж байгаа reference болон primitive төрлийн параметруудын төлвийг тодорхойлох 1.4. Өгөдсөн жишээ кодноос обьектын garbage collection-н хувьд тохиромжтой болох цэгийг, finalize() хийх үе дэх нөлөөг тодорхойлох 1.5. Jar файл дотор эсвэл гадна байрлах class-н бүтэн-нэр нь өгөдсөн байхад тохиромжит directory бүтцийг тодорхойлох, мөн код болон classpath өгөдсөн байхад тухайн код амжилттай compile хийж чадах эсэхийг тодорхойлох 1.6. Утга оноох(=, +=, -=), арифметик(+, -, *, /, %, ++, --), харьцуулах(<, <=, >, >=, ==, !=), instanceof, логик(&, |, ^, !, &&, ||) мөн нөхцөлт(? :) үйлдлүүд ашиглан өгөгдсөн хариуг гаргах код бичих. Хоёр обьект эсвэл хоёр primitive утгын тэнцлийг шалгах код бич. 2. Java class бичих Objective 1.1. дээр хэлсэнчлэн та код бичих чадвартай байх хэрэгтэй бөгөөд жава код нь class-н тодорхойлолтын дунд нь бичигдэх ба class нь обьектыг тодорхойлж обьект нь програмын тань “нэр үгийн” үүргийг гүйцэтгэх юм. Обьект нь “телевиз”, “ажилтан” гэх мэт бодит зүйлийг илтгэж болохын адил заримдаа бодит бус event handler, файлаас унших stream гэх мэт зүйлийг ч илтгэж болно. Эхлэн суралцагсдад хэлэхэд Java class нь .java гэсэн өргөтгөлтэй текст файлд бичигдэнэ. Хэрэв тухайн class нь public гэж зарлагдсан бол текст файлын нэр нь class-н нэртэй адилхан байх шаардлагтай бөгөөд .java файл нь нэгээс илүүгүй top-level public class агуулсан байна. Жишээ нь доорх class-н тодорхойлолт нь Cat.java гэсэн нэртэй файл дотор л байна. public class Cat{ public String name; public int weight; } Compile хийгдсэн жава код нь bytecode гэж нэрлэгддэг ба bytecode файлын нэр нь compile хийгдсэн class-н нэртэй адилхан байна. Жишээ нь Cat.java-г compile хийх үед Cat.class гэсэн bytecode файл үүснэ. Public гэж зарлагдсан class нь нэгээс их биш бол Java нэг .java файл дотор олон class агуулахыг зөвшөөрдөг. Compiler нь class бүрийн хувьд тусад нь .class файл үүсгэдэг. Жишээ нь доорх Customer.java файл нь 2 class-н тодорхойлолт агуулсан байна. 1. public class Customer{ 2. public String name; 3. public String address; 4. } 5. 6. class Order{ 7. public int partNumber; 8. public int quantity; 9. public boolean shipped; 10. } Customer.java файлыг compile хийх үед Customer.class мөн Order.class гэсэн хоёр bytecode файл үүснэ. Энд анхаарах хэрэгтэй зүйл нь: Customer нь public гэж зарлагдсан учир Order class нь public байж болохгүй, top-level-class protected юмуу private байж болдоггүй учир Order нь protected болон private байж болохгүй. | Шалгалтанд зориулж | Top-level-class нь хоёр төрлийн л access modifier авч болдог: public болон package-level (default-access | гэж ихэвчлэн нэрлэгддэг). Энэ заалтыг зөрчсөн шалгалтын асуултуудаас болгоомжлоорой | | // “modifier private not allowed here” гэсэн compiler-н алдаа өгнө | private class HelloWorld{ | public static void main(String[] args){ | System.out.println(args[1] + args[2]); | } | } 3. Package Package нь class болон interface-үүдийн груп юм. (enumeration болон annotated төрлүүд ч мөн орж болно, гэхдээ эд нар нь class, interface-н нэг төрөл болохоор тусад нь бичсэнгүй). Package нь груплэж буй class/interface-үүдийнхээ хэрэглээ болон хамаарал дээр нь үндэслэж үүссэн байдаг. Жишээ нь java.io package нь input/output, java.net нь networking-тэй хамааралтай class/interface-г агуулсан байдаг. Package-н гол 2 ашиг нь: - Class/Interface-үүдийг хэрэглээ хамаарлаар нь груплэж, програмыг цэгцэлдэг. - Class/interface-д namespace болж өгдөг 3.1. package түлхүүр үг package түлхүүр үг нь кодны хамгийн эхний мөр бөгөөд class/interface-н package-д хамааруулж өгдөг юм. Class/Interface-н бүтэн нэр (fully qualified name) нь “package-н нэр + Class/Interface-н нэр” гэж бүрддэг. Жишээ нь : ia.nid.web.beans. passport.PassportBean. Compile хийхэд үүсэх bytecode файл нь package-н нэртэй адилхан бүтэцтэй directory-д үүсдэг. Жишээ нь : /ia/nid/beans/passport/PassportBean.class. Class/Interface-г өөр ямар нэг class-с дуудах/ашиглах үед тухайн class-аа бүтэн нэрээр нь дуудах хэрэгтэй болдог. Жишээ нь: public class CreatePassport{ public static void main(String[] args){ ia.nid.web.beans.passport.PassportBean passportBean = new ia.nid.web.beans.passport.PassportBean(); } } 3.2. import түлхүүр үг Дээрх жишээнээс харахад class дуудаж ашиглана гэдэг нь ихээхэн хэцүү ажил болж байгаа биз... Тэгвэл import түлхүүр үг нь class-н бүтэн нэрийг нь хэрэглэлгүй дуудаж ашиглах боломж олгодог юм. (зөвхөн class-н нэр) Import түлхүүр үг нь нэг файлыг импорт хийхээс гадна хэрэв од(*) ашиглавал бүхэл package-г ч импорт хийнэ. Энэ түлхүүр нь package-н тодорхойлолт (package түлхүүр үг орсон мөр) –н дараа нь хэдэн ч мөрөөр бичигдэж болно. Import түлхүүүр ашигласан болон ашиглаагүй 2 кодыг compile хийхэд яг адилхан 2 bytecode үүсдэг. Учир нь compile хийх үед compiler нь бүх import илэрхиллүүдийг устгаад, бүх class-г бүтэн нэрээр нь сольдог. Анзаарсан бол дээрх код String class руу хандсан байна. String нь java.lang package-д байрладаг боловч кодонд ямар нэг String-г import хийж буй илэрхийлэл алга. Java.lang package нь автоматаар бүх эх кодод import хийгддэг өвөрмөц package юм. Тийм болохоор java.lang-н class руу import ашиглалгүй(богино нэрээр) хандаж болдог. Import илэрхийллийн бичлэгээс мөн адилхан package нэрлэлтээс болж алдаа (ambiguous reference) гарч болно. Жишээ авч ярих... 3.3. Package-н directory бүтэц Objective 1.5. дээр хэлсэнчлэн та тодорхой class-т зориулагдсан directory бүтэц байгуулж чаддаг байх хэрэгтэй. Bytecode файл нь package-н нэртэйгээ адилхан бүтэцтэй directory-д байх хэрэгтэй болохоор энэ нь чухал сэдэв юм. package ia.nid.web.beans.passport; public class Passport{ public Passport(){ System.out.println(“Passport”); } } Энэхүү class нь C:\myproject\src\ia\nid\web\beans\passport\Passport.java файлд байрладаг гэж бодъё. (ерөнхий зарчим, src гэсэн directory-д эх кодын файлуудаа хийх) Энэ class-аа compile хийхдээ bytecode файлуудаа build гэсэн directory-д хуулахыг хүслээ гэж бодъё. Үүний тулд –d flag ашиглах хэрэгтэй, -d flag нь 2 төрлийн үүрэг гүйцэтгэдэг. - Compile хийгдсэн код –d flag-р тодорхойлогдсон directory-руу хуулагдана - Хуулагдахдаа, package-н бүтэц адилхан фолдерийн бүтэц үүсгэнэ. Дээрх жишээ эх кодыг c:\myproject\src фолдероос compile хийнэ гэвэл: javac –d c:\myproject\build .\ia\nid\web\beans\passport\Passport.java Харин үүнээс үүсэх .class файл нь: c:\myproject\build\ia\nid\web\beans\passport\Passport.class 3.4. CLASSPATH Environment variable Objective 1.5. дээр хэлсэнчлэн та өгөгдсөн classpath нь compile хийхэд хангалттай эсэхийг тодорхойлж чаддаг байх хэрэгтэй. Classpath нь ашиглах гэж буй .class файлын хаана байгааг нь зааж өгдөг бөгөөд CLASSPATH гэсэн “environment variable”д хадгалж болдог. CLASSPATH-д өөрийн сонгож хадгалсан фолдерууд болон jar-уудынхаа замыг өгөх бөгөөд JVM нь эндээс таны .class файлуудыг хайна. Жишээ : Дээрх passport.class доорх фолдерт байгаа. c:\myproject\build\ia\nid\web\beans\passport\ Тэгвэл CLASSPATH –д хийх фолдерын зам нь: c:\myproject\build юм. Учир нь JVM-д фолдер(системийн) нь хэрэгтэй болохоос package-н зам нь хэрэггүй юм. Энэндээр шинээр сурагчид их алдаа гаргадаг тул анхаарарай. Одоо Windows болон Unix дээр яаж CLASSPATH-г тохируулахыг харъя. Windows-т set командыг ашиглаж “;” цэгтэй таслалаар ялгана. set CLASSPATH=c:\myproject\build;.;c:\tomcat\lib\servlet.jar; Unix-т setenv командыг ашиглаж “:” тодорхойлох цэгээр ялгана. setenv CLASSPATH /usr/build:/myproject/build:/tomcat/lib/servlet.jar 4. Жава програмыг ажиллуулах Objective 1.2. дээр хэлсэнчлэн та command-line-с жава програм ажиллуулах чадвартай байх хэрэгтэй. Жава програмын эхлэлийн цэг нь аль class дотор байрлаж болох main функц(method) байдаг. Энэ method-н signature нь доорх хэлбэртэй байж болдог: public static void main(String[] args) static public void main(String[] x) public static void main(String... args) Main method нь JVM-г чөлөөтэй хандуулах үүднээс public зарлагдаж, ямар нэг обьект үүсгэлгүй ажиллуулах үүднээс static байгаа юм. Жишээ: 1. public class SayHello{ 2. private static String message = “Hello!”; 3. 4. public static void main(String[] args){ 5. System.out.println(message); 6. } 7. } Энэ class-г ажиллуулах command-line-г харцгаая C:\myproject>javac SayHello.java C:\myproject>java SayHello Hello! C:\myproject>set CLASSPATH=c:\myproject C:\myproject>cd.. C:\>java SayHello Hello! Дээрхээс харж байгаа байх, java нь програм ажиллуулах команд юм. java команд нь аргумент болгож class-н нэрийг (бүтэн) авдаг. (bytecode файлын нэр “.class” биш). Одоо арай том жишээ авъя. 1. package com.sybex.events; 2. 3. import java.awt.Component; 4. import java.awt.Color; 5. import java.awt.event.*; 6. 7. public class ColorChanger implements ActionListener { 8. private Component container; 9 10. public ColorChanger(Component c) { 11. container = c; 12. } 13. 14. public void actionPerformed(ActionEvent e) { 15. String color = e.getActionCommand(); 16. if (color.equals("red)) { 17. container.setBackground(Color.RED); 18. } else if (color.equals("blue")) { 19. container.setBackground(Color.BLUE); 20. } else { 21. container.setBackground(Color.WHITE); 22. } 23. } 24. } Энэ ColorChanger.java гэсэн class нь c:\myproject\src\com\sybex\events гэсэн фолдерт байгаа бөгөөд compile хийхдээ (c:\myproject\src дотроос) доорх командыг ашиглана. javac –d c:\myproject\build .\com\sybex\events\ColorChanger.java Ингэснээр c:\myproject\build\com\sybex\events дотор ColorChanger.class гэсэн файл үүснэ. Дараагийн class нь main method агуулах бөгөөд ColorChanger class-г тестлэх юм. 1. package com.sybex.demos; 2. 3. import com.sybex.events.ColorChanger; 4. import java.awt.Button; 5. import java.awt.Color; 6. import java.awt.event.ActionEvent; 7. 8. public class TestColors { 9. 10. public static void main(String args[]) { 11. Button b = new Button("Testing ..."); 12. b.setBackground(Color.GREEN); 13. System.out.println("Color is " + b.getBackground()); 14. 15. ColorChanger cc = new ColorChanger(b); 16. ActionEvent action = new ActionEvent(b, 17. ActionEvent.ACTION_PERFORMED, 18. "blue"); 19. cc.actionPerformed(action); 20. System.out.println("Now the color is " + b.getBackground()); 21. } 22. } TestColors.java нь c:\myproject\src\com\sybex\demos фолдерт байгаа бөгөөд доорх команд-р compile хийгдэнэ. (c:\myproject\src дотроос) javac –d c:\myproject\build .\com\sybex\demos\TestColors.java Ингэснээр c:\myproject\build\com\sybex\demos дотор TestColors.class гэсэн файл үүснэ. Доор нийт project-н фолдерийн бүтцийг харуулж байна: * c:\myproject\ * + src\ * | + com\ * | + sybex\ * | + demos\ * | | + TestColors.java * | + events\ * | + ColorChanger.java * + build\ * + com\ * + sybex\ * + demos\ * | + TestColors.class * + events\ * + ColorChanger.class Энэхүү програмыг ажиллуулахын тулд (c:\myproject\build дотроос)доорх команд шаардлагатай болно: java com.sybex.demos.TestColors // энд fully-qualified-name ашиглана!!! Хэрэв хаанаас ч хамаагүй дээрх програмыг ажиллуулахыг хүсвэл CLASSPATH-д build фолдероо зааж өгөх хэрэгтэй болно. set CLASSPATH c:\myproject\build 4.1. -classpath Flag Програмаа ажиллуулахын тулд байнга set CLASSPATH командыг ашиглах шаардлагагүй юм. JVM-г ажиллуулж буй java команддаа –classpath гэсэн аргумент нэмж хүссэн classpath-аа зааж өгч болно. Жишээ нь бид доорх командыг ашиглаж TestColors програмыг хаанаас ч хамаагүй ажиллуулна чадна: java –classpath c:\myproject\build com.sybex.demos.TestColors -classpath аргументын араас орж буй classpath-н утганд хэдэн ч фолдер юм уу jar файл бичиж болно, Windows-т “;” Unix-т “:”-р тасалж. Мөн –cp болон –classpath хоёр яг ижилхэн үүрэг гүйцэтгэнэ. –cp гэдэг нь –classpath-н товчилсон хэлбэр нь юм. 4.2. JAR файлууд Bytecode нь JAR файл гэж нэрлэгддэг архивлагдаж(archived), шахагдсан(compressed) файлд хадгалагдаж болдог, JVM нь задлалгүйгээр JAR файл дотроос bytecode-г уншиж чаддаг бөгөөд JAR файл нь жава програм түгээх(distribute) хамгийн түгээмэл арга юм. Мөн шалгалтанд энэ талаар асуудаг :P JDK нь jar файл үүсгэж, задлах зориулалттай jar.exe гэсэн хэрэгсэл (tool)-тэй ирдэг. Jar файл үүсгэх жишээ: C:\myproject\build>jar –cvf myproject.jar . added manifest adding: com/(in = 0) (out = 0)(stored 0%) adding: com/sybex/(in = 0) (out = 0)(stored 0%) adding: com/sybex/demos/(in = 0) (out = 0)(stored 0%) adding: com/sybex/demos/TestColors.class(in = 1209) (out = 671)(deflated 44%) adding: com/sybex/events/(in = 0) (out = 0)(stored 0%) adding: com/sybex/events/ColorChanger.class(in = 883) (out = 545)(deflated 38%) Эндээс -c нь шинэ JAR файл үүсгэх (create) -v нь (verbose) -f нь шинэ JAR файлын нэрийг нь өгч үүсгэхийг хэлж байгаа юм. Шинэ файлын нэрийн дараа bytecode-нхоо байршиж буй фолдерийн замыг заана, манай жишээн дээр одоогийн фолдер нь байсан учир “.” Тавьсан байна. JAR файл нь дотроо package-н бүтцийг агуулдаг бөгөөд, энэ нь дээрх JAR файл үүсгэх командаас харагдаж байна. JAR файлыг ч бас CLASSPATH-д хийж ашиглаж болно: C:\>set CLASSPATH=c:\myproject\build\myproject.jar C:\>java com.sybex.demos.TestColors Color is java.awt.Color[r=0,g=255,b=0] Now the color is java.awt.Color[r=0,g=0,b=255] Дээрх жишээн дээрээс яагаад эх кодын файлыг “src”, bytecode файлыг “build” фолдерт хийн ялгаж байгааг хараад гайхаж байгаа байх. Ерөнхийдөө хүмүүс JAR файл үүсгэхдээ дотор нь эх кодоо хуулахыг хүсдэггүй учраас тусад нь ялгах нь амар байдаг юм. Мөн “src” доторх .java файлууд package-нхаа бүтцээр фолдерт хуулагдсан байгаа. Уул нь .java файлуудын хувьд ийм байх шаардлагагүй ч, javadoc ашиглаж documentation үүсгэхэд эх кодын файлуудыг ч ийм бүтэцтэй байлгах хэрэгтэй болдог. Javadoc нь шалгалтанд сэдэв болж ирэхгүй ч бодит амьдралд java-н нэг салсшгүй хэсэг болдог. 4.3. command-line аргументууд java.exe нь JVM-г асаадаг бөгөөд java.exe-н дараа main method агуулсан class-н нэр орж ирдэг. Command-line-н аргументууд нь main method-д String[] хэлбэрээр ирдэг. Жишээ нь, 1. package com.sybex.demos; 2. public class PrintGreetings{ 3. public static void main(String[] args){ 4. for (int i = 0; i < args.length; i++){ 5. System.out.println(message); 6. } 7. } 8. } Энд нэг зүйлийг анхаарах хэрэгтэй нь аргументын индекс нь 0-с эхэлж байгаа нь. Шалгалтанд энийг шалгасан асуулт ирдэг. Мөн, хэдийгээр өөр утга илэрхийлж байсан ч бүхий л жава command-line аргументууд нь String байдаг. Өөрөөр ашигламаар байвал String-с бусад төрөл рүү хөрвүүлж болно.

No comments:

Post a Comment